使用兩個佇列實現乙個棧,使用兩個棧實現乙個佇列

2021-08-16 15:11:49 字數 3437 閱讀 3913

一、棧與佇列的特點

(一)棧

棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。

進行資料插入和刪除操作的一端稱為棧頂,另一端稱為棧底。不含任何元素的棧稱為空

棧,棧又稱為後進先出的線性表。

棧的特點:後進先出(lifo)

(二)佇列

佇列:只允許在一端進行插入資料操作,在另一端進行刪除資料操作

的特殊線性表。進行插入操作的一端稱為隊尾,通常稱為入佇列;進行刪除操作的一端稱為隊頭,通常稱為出佇列。

佇列的特點:先進先出(fifo)

二、用兩個棧實現乙個佇列

利用棧與佇列的特殊特性,在實現棧與佇列的轉換之時,只需改變元素的出佇列順序即可

例如有兩個棧s1與s2

(1)元素入佇列:將入棧元素放在s1中,只是利用s1作為元素的入棧

(2)元素出佇列:在棧中,元素先進後出,而在佇列中,元素先進先出,因此再出佇列之時,借助s2,將棧中的元素進行反置,如果棧s2中有元素,則將s2的棧頂元素刪除,如果s2為空棧,則將s1中的元素依次壓入到s2中,

直到s1為空,最後在將s2中的棧頂元素彈出即可

(3)取佇列的頭元素:如果s2不為空,則取s2的棧頂元素,如果s2為空,則將s1中的元素依次壓入到s2中,再取s2的棧頂元素即可

(4)取隊尾元素:如果s1不為空,取s1的棧頂元素即可,如果s1為空而s2不為空,則將s2中的元素壓入到s1中,再取s1的棧頂元素即可

(5)求佇列中元素的總個數:即s1中元素的總個數+s2中元素的總個數

(6)判斷佇列是否為空:如果s1與s2都為空,則佇列就為空

主要**如下所示:

//用兩個棧實現乙個佇列

template

class queue

void push(const t&data)

void pop()

while (!s1.empty())

s2.pop();}}

t front()

while (!s1.empty())

return s2.top();

}t back()

while (!s2.empty())

return s1.top();

}size_t size()

bool empty()

private:

stack

s1;stack

s2;};

測試**如下所示:

用兩個棧實現乙個佇列

void testlinestack()

else

//佇列中有元素

s.push(1);

s.push(2);

s.push(3);

if (s.empty())

else

//從對列中刪除元素

s.pop();

if (s.empty())

else

//新增元素

s.push(4);

if (s.empty())

else

//刪除佇列中的元素直到為空

s.pop();

s.pop();

s.pop();

if (s.empty())

else

}

結果如下所示:

三、利用兩個佇列實現乙個棧

利用兩個佇列實現乙個棧中,將乙個佇列作為使用佇列,乙個佇列作為空置佇列,即利用兩個標記值,判斷佇列的使用情況

例如有兩個佇列q1,q1_used,q2,q2_used,初始值設為q1_used=true,q2_used=false,因此在最初之時,預設將元素放在q1中

(1)元素入棧:將所有元素放在使用的佇列中

(2)元素出棧:如果當前q1為使用的佇列,將佇列q1中的元素按照佇列的特性依次放入到q2中,直至佇列q1只有乙個元素為止,刪除q1中的最後乙個元素,最後修改q1與q2的使用狀態,

如果q2為當前使用的佇列,情況與上面相同。

(3)取棧頂元素:即取非空佇列中的隊尾元素

(4)求棧中元素個數的多少:即取非空佇列中元素的個數

(5)判斷棧是否為空:如果q1與q2都為空,則棧就為空

主**如下所示:

//用兩個佇列實現乙個棧

template

class stack

void push(const t&data)

if (q2_used == true)

}void pop()

q1.pop();

q1_used = false;

q2_used = true;

return;

}if (!q2.empty())

q2.pop();

q1_used = true;

q2_used = false;

return;

}return;

}t top()

size_t size()

if (!q2.empty())

return

0; }

bool empty()

private:

queue

q1;bool q1_used;

queue

q2;bool q2_used;

};

測試**如下所示:

//用兩個佇列實現乙個棧

void teststackline()

else

//往棧中新增元素

s.push(1);

s.push(2);

s.push(3);

s.push(4);

s.push(5);

s.push(7);

if (s.empty())

else

//刪除棧中元素

s.pop();

if (s.empty())

else

//刪除棧中元素直至為空

s.pop();

s.pop();

s.pop();

s.pop();

s.pop();

s.pop();

if (s.empty())

else

}

結果如下所示:

只有不停的奔跑,才能不停留在原地!!!

使用兩個棧實現乙個佇列 使用兩個佇列實現乙個棧

棧的特點是先進後出 佇列的特點是先進先出 用兩個棧實現乙個佇列,必須保證它先進先出 入棧和如佇列沒什麼區別,區別就在出棧和出佇列 用兩個棧實現乙個佇列,入佇列時可以將全部資料壓入空棧s1,然後將棧s1的全部元素壓入棧s2,此時s2的棧頂元素要出佇列的元素了。include template clas...

兩個棧實現乙個佇列 兩個佇列實現乙個棧

這兩個題的思路比較相似。棧的特點是 先進後出 佇列的特點是 先進先出 不要怕!用兩個棧實現乙個佇列很簡單 再將top元素push到stack 2中,然後將stack 1 pop一次直到stack 1剩下最後乙個元素,這個就是最先push進去的,我們把它pop掉就可以了,同理,我們求queue的fro...

兩個棧實現乙個佇列,兩個佇列實現乙個棧

1 兩個棧實現乙個佇列 入隊時,直接壓入stack1中。出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,否則直接彈出stack2中的元素。入隊操作 void enqueue stack s1,stack s2,int m 出隊操作 void deq...