【死磕演算法·棧與佇列】如何用雙棧實現佇列操作?
阿新 • • 發佈:2018-12-22
題目要求:
編寫一個類,只能用兩個棧結構實現佇列,支援佇列的基本操作add(),poll(),peek()
題目思路:
棧是先進後出,佇列是先進先出。用兩個棧可以將順序反過來,實現佇列操作
設定兩個棧stackPush(壓入棧)和stackPop(彈出棧),一個只進行push操作,一個只進行pop操作。
將stackPush中的值都倒入到stackPop中,再從stackPop中彈出就是佇列的操作了。
兩個注意點:
1、從stackPush向stackPop中倒入資料時,必須將stackPush中的資料一次性全部倒完。(不然在stackPush棧底的元素(最先入棧的元素)到不了stackPop的棧頂,發生一次pop操作就會出錯)
2、stackPop不為空時,不能往裡面倒入數。(不然先入棧的數會在棧的底端不能按照佇列性質儘快彈出)
從stackPush倒入stackPop中這個操作可以加入在add()或者poll()或者peek()中,只要不違反兩個注意點即可。
程式碼實現:
class TwoStack { public: stack<int>stackPush;stack<int>stackPop;//兩個棧 vector<int>result; void push(int value){ stackPush.push(value); } void pop(){ result.push_back(stackPop.top()); stackPop.pop(); } void trans(){ while(!stackPush.empty()){ stackPop.push(stackPush.top()); stackPush.pop(); } } vector<int> twoStack(vector<int> ope, int n) { // write code here for(int i = 0;i<n;i++){ if(ope[i]!=0) push(ope[i]); if(ope[i]==0)//在pop之前,如果stackPop為空,把stackPush中的元素倒入stackPop中 { if(stackPop.empty()) trans(); pop(); } } return result; } };