一、棧與佇列的特點
(一)棧
棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。
進行資料插入和刪除操作的一端稱為棧頂,另一端稱為棧底。不含任何元素的棧稱為空
棧,棧又稱為後進先出的線性表。
棧的特點:後進先出(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...