兩個隊列實現一個棧,寫了兩個棧實現一個隊列後,基本上思路是比較清晰的...但我發現貌似就不能用O(1)時間的實現出棧,我本身想的是每次出棧,數據存放的隊列就會換到另外一個,進棧卻是不復雜,只用找到一個不是空的隊列就行了。ios
代碼:spa
#include <iostream> using namespace std; #define sizeOfBuffer 5 struct Stack { int val; int base; int top; }Queue1[sizeOfBuffer], Queue2[sizeOfBuffer]; class MyFunc { public: struct Stack* initStack(struct Stack* Q) { Q = new struct Stack; Q->base = Q->top = 0; return Q; } bool PushStack(struct Stack* Q, int Data) { if(Q->base != sizeOfBuffer && Q->top == 0) { Queue1[Q->base++].val = Data; } else if(Q->top != sizeOfBuffer && Q->base == 0) { Queue2[Q->top++].val = Data; } else return false; return true; } bool PopStack(struct Stack* Q) { if(Q->base == 0 && Q->top == 0) return false; else if(Q->base != 0 && Q->top == 0) { while(--Q->base > 0) { Queue2[Q->top] = Queue1[Q->top]; ++Q->top; } } else { while(--Q->top > 0) { Queue1[Q->base] = Queue2[Q->base]; ++Q->base; } } return true; } int GetStackCount(struct Stack* Q) { return Q->base ? Q->base : Q->top; } void PrintStackMember(struct Stack* Q) { int i = Q->base, j = Q->top; while(i || j) { cout << (i ? Queue1[--i].val : Queue2[--j].val) << ' '; } } }; int main() { struct Stack* SP = NULL; int Data; char Ch; SP = MyFunc().initStack(SP); cout << "1) 入棧 2) 出棧" << endl << "3) 棧 4) 個數" << endl << "5) 退出" << endl << "請輸入對應的編號進行操做" << endl; Ch = cin.get(); while(Ch != '5') { switch(Ch) { case '1' : cout << "輸入:" << endl; cin >> Data; MyFunc().PushStack(SP, Data) == true ? cout << "已入棧" << endl : cout << "Stack overflow!" << endl; break; case '2' : MyFunc().PopStack(SP) == true ? cout << "已出棧" << endl : cout << "Stack underflow!" << endl; break; case '3' : cout << "顯示數據:" << endl; MyFunc().PrintStackMember(SP); cout << endl; break; case '4' : cout << "當前棧個數:" << MyFunc().GetStackCount(SP) << endl; break; } Ch = cin.get(); } delete SP; SP = NULL; return 0; }
...貌似也沒什麼好說的QAQ,就這樣吧。blog