思路(書中標準解法:用兩個佇列實現乙個棧):
(1)對於插入操作,棧與佇列都是從隊尾進行,因此很容易完成。
(2)對於彈出操作,佇列從隊頭開始,而棧從隊尾開始,要想取到隊尾元素,需要第二個佇列的協助:假設queue1不為空,queue2為空,將queue1的原書依次取出放到queue2中,同時判斷,當queue1的長度為1時,不要將該元素放到queue2中,而是直接取出丟棄,此時即完成了棧的彈出操作。也就是說,彈出乙個元素,其他元素的儲存位置就會從本佇列移動到另乙個佇列中。
總結下,運作過程中,queue,queue2一定至少乙個為空。插入操作選擇queue1,queue2中不為空的那個佇列插入(如果都為空,隨意選擇乙個),彈出時將不為空的佇列除最後乙個佇列的其他元素依次取出放到另乙個佇列中,而將最後那乙個元素取出丟棄即可。
另種思路,僅供參考(c++**如下)
1. 至少用兩個棧
2. 插入操作,直接入棧1;刪除操作,把入棧1的資料依次彈出並且入棧2, 棧2的棧頂就是目標元素
3. 棧1在彈出時,應該是彈到目標元素,停止出棧,棧2在接收到目標元素後,再把棧內已存放的資料再壓回棧1
4. 始終保證棧1每次都是只刪除目標元素,棧2為空,其他資料以及位置不變
#include using namespace std;
const int max=100;
typedef char type; //這樣更安全,使用者看不到內部資料型別 ,程式提供的是介面
struct stack;
void push(stack &s1,char elem)
else //入棧
} void print(const stack s)
print(s1);
pop(s1,s2,'b');
print(s1);
print(s2);
return 0;
}
劍指offer第6題 用兩個棧實現佇列
示例 1 輸入 3 輸出 null,null,3,1 示例 2 輸入 5 2 輸出 null,1,null,null,5,2 思路 新鍵兩個棧,棧1放元素,棧2為中轉。當需要輸出對頭時,我們只需要將第乙個棧的元素放去棧2,然後輸出棧頂元素。當取出隊頭後,棧2並不需要清除,只需要放在那裡就好,因為棧2...
leetcode刷題 劍指offer 棧佇列堆
題目描述 class cqueue stack1.push value public int deletehead if stack2.isempty return 1 else return stack2.pop 沒有第二解法了,就這麼乙個辦法 題目描述 解法1 輔助棧,乙個棧完成push,pop...
棧和佇列 劍指offer
題目 定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的 min函式。class solution def init self self.elem def push self,node def pop self return self.elem.pop def top self return...