堆疊與佇列模擬

2021-05-22 13:12:22 字數 966 閱讀 8257

兩個題目:1、用兩個堆疊模擬乙個佇列;2、用兩個佇列模擬乙個堆疊

先看第乙個問題:用兩個堆疊模擬乙個佇列:只需要明白堆疊和佇列的特點,乙個是先進後出,乙個是先進先出就好做事了。乙個堆疊是先進先出,再把這個堆疊的資料存放到第二個堆疊不就ok了,變成了先進先出了麼?所以解決方法1就是兩個棧 stack1,stack2,

void enqueue(elemtype  e)

//先把stack1中的資料導到stack2中去

while(!stack1.empty())

elemtype temp;

stack1.pop(temp);

stack2.push(temp);

//把新來的資料存放到stack1中去

stack1.push(e);

//再把stack2中的資料倒回來到stack1中

while(!stack2.empty())

elemtype temp;

stack2.pop(temp);

stack1.push(temp);

void dequeue(elemtype  &e)

if(!stack1.empty())

stack1.pop(e);

這裡由於乙個stack2總是作為乙個臨時的周轉用的空間,可能效率上低了些。下面這個演算法可以充分利用stack1和stack2的空間,時間複雜度上面也優化了些。

stack1 作為輸入棧,只要他沒有滿,就可以一直輸入,一旦滿,而且stack2為空,就把stack1中的資料導到stack2中去。再看能不能入棧。

stack2作為輸出棧,只要其中有資料,就可以一直輸出,一旦空,就把stack1中的資料導進來,再輸出。

所以判斷佇列中有沒有資料需要判斷兩個堆疊裡面有沒有資料。

問題2:用兩個佇列模擬乙個棧,這個效率感覺太低了,想不出來有什麼高招。入棧的時候,放在佇列1尾部,出棧時,把佇列1的資料全部gettop移到隊伍2中,細節方面也要注意。

用堆疊模擬佇列,和用佇列模擬堆疊

最近在看 演算法導論 第十章裡面有一題是用了 兩個堆疊模擬乙個佇列,我設計的演算法如下 堆疊a和b,a用作入隊,b出隊 1 判隊滿 如果a滿且b不為空,則隊滿 2 判隊空 如果a和b都為空,則隊空 3 入隊 首先判隊滿。若隊不滿 1 棧a若不滿,則直接壓入棧a 2 若a滿,則將a中的所有元素彈出到棧...

堆疊與佇列

堆疊與佇列可以用陣列實現,也可以用鍊錶實現。下文統一用鍊錶實現上述資料結構。堆疊服從先進後出原則,只對棧頭進行刪除和插入操作,即封鎖了鍊錶的一端,只對鍊錶的另一端進行操作,就形成了邏輯上的堆疊結構。節點 public class stacknode 堆疊實現 public class stackli...

佇列與堆疊

兩個線性資料結構 堆疊 stack 和佇列 queue 堆疊中元素具有後進先出lifo last in fisrt out 而佇列中的元素確實先進先出fifo fisrt in last out define maxsize 50 define false 0 define true 1 typed...