題目敘述: 本題要求僅能使用兩個Queue來實現具有LIFO特性的Stack功能,需要能夠支援正常的Stack操作像是(push, pop, top, empty功能),題目額外提醒,我們只能使用常規queue操作,像是push to back, peek/pop from the front, size, isEmpty。
classMyStack { public: queue<int> q1; queue<int>q2; MyStack() { } voidpush(int x){ q1.push(x); } intpop(){ int size = q1.size(); int result; if(q1.empty()){ //cout << "empty queue" << endl; return-1; } for (int i = 0; i < size; i++) { //the last element in the queue if(i==size-1) { result = q1.front(); q1.pop(); //copy q2 to q1 size = q2.size(); for(int j = 0; j < size; j++) { q1.push(q2.front()); q2.pop(); } size =0; } else{ q2.push(q1.front()); q1.pop(); } } return result; } inttop(){ if(!q1.empty()) return q1.back(); else{ //cout << "empty queue" << endl; return-1; } } boolempty(){ if(q1.size()==0) returntrue; elsereturnfalse; } };
/** * Your MyStack object will be instantiated and called as such: * MyStack* obj = new MyStack(); * obj->push(x); * int param_2 = obj->pop(); * int param_3 = obj->top(); * bool param_4 = obj->empty(); */
說明
一開始宣告兩個 int 型別的Queue, q1 和 q2
1 2
queue<int> q1; queue<int> q2;
push 函數將元素 x 推入Stack中,實際操作其實是將資料加入到 q1 的尾部
1 2 3
voidpush(int x){ q1.push(x); }
pop 函數,首先檢查 q1 是否為空,如果回空直接返回。接著就是迭代 q1 queue,將除了最後一個資料的其他資料從 q1 移動到 q2,一旦發現最後一個資料,將它保存在 result 變數中,並將最後元素從 q1 pop 出來,接著將 q2 queue中資料全部移動回 q1,方便下一次的 push操作。最後就是回傳 result。