如何用兩個佇列實現棧?
思路分析:建立佇列
q1,在第佇列中入隊元素1,
2,3,
4。我們知道,佇列是先進先出的,如果出隊的話,得到的元素是
1,而不是
4。而按照棧的要求,出棧的元素應該是4.
那麼怎樣得到佇列的最後乙個元素
4呢?這個時候,就要借助第二個佇列了。建立空佇列
q2,我們可以將佇列的中元素乙個個出隊,然後將出來的元素入隊到佇列
q2中。這樣,分別將1,
2,3從佇列q1
**隊,然**隊佇列
q2。當最後乙個元素4從
q1**隊時,將這個元素返回即可。這樣,一次迴圈下來,1,
2,3元素從
q1到了
q2,佇列最後乙個元素
4被排出,實現了後進先出的操作,相當於棧的
pop操作。 下次
pop的時候,再進行同樣的操作即可,只是這時候元素都移動到
q2中了,我們從
q2中迴圈出隊元素到
q1中即可。
我們試著寫一下**,首先通過陣列實現佇列,定義入隊和出隊的函式:
struct queue ;
void enqueue(struct queue* q, int node)
q->tail = (q->tail + 1) % 20;
q->a[q->tail] = node;
}int dequeue(struct queue* q)
q->head = (q->head + 1) % 20;
return q->a[q->head];
}
接下來就是題目的關鍵,利用兩個佇列,實現棧的pop操作:
int pop(struct queue* q1, struct queue* q2)
int n = dequeue(q1);
return n;
}
主函式測試一下:
int main()
需要注意的是,在主函式中測試時,pop函式每次呼叫的時候,q1和q2要互換位置,因為每次pop,元素都會從乙個佇列搬到另乙個佇列。 用兩個棧實現佇列 用兩個佇列實現棧
劍指offer 面試題7 用兩個棧實現佇列。templateclass cqueue 我們試著用兩個棧來模擬佇列的操作,發現如下可行操作 完整 實現 面試題7 用兩個棧實現佇列 分別完成在隊尾插入結點和在隊頭刪除結點的功能。date 2014 06 27 include include includ...
用兩個棧實現佇列與用兩個佇列實現棧
pragma once要在標頭檔案的最開始加入這條雜注,就能夠保證標頭檔案只被編譯一次 pragma once是編譯器相關的,就是說即使這個編譯系統上有效,但在其他編譯系統也不一定可以,不過現在基本上已經是每個編譯器都有這個雜注了。用兩個棧實現佇列 每個模板函式的實現都需要加template模板列表...
用兩個棧實現佇列 與 用兩個佇列實現棧
用兩個棧實現乙個佇列的功能?要求給出演算法和思路 分析 入隊 將元素進棧a 出隊 判斷棧b是否為空,如果為空,則將棧a中所有元素pop,並push進棧b,棧b出棧 如果不為空,棧b直接出棧。用兩個佇列實現乙個棧的功能?要求給出演算法和思路 分析 入棧 將元素進佇列a 出棧 判斷佇列a中元素的個數是否...