一、題目
說明如何用一個數組A[1..n]來實現兩個棧,使得兩個棧中的元素總和不到n時,兩個都不會發生上溯。注意PUSH和POP操作的時間應為O(1)
二、思考分別用數組的兩端作為兩個棧的起點,向中間擴充,兩個棧中的元素總和不超過n時,兩個棧不會相遇
三、代碼
//用一個數組實現兩個棧struct stack2{//棧1和棧2的棧頂指標int top1, top2;//分別初始化為0和n+1int len;//數組長度int *s;//數組stack2(int size):top1(0),top2(size+1),len(size){s = new int[size+1];}};//分別輸出兩個棧,從棧底到棧頂void Print(stack2 S){int i;cout<<"stack1:";for(i = 1; i <= S.top1; i++)cout<<S.s[i]<<' ';cout<<endl;cout<<"stack2:";for(i = S.len; i >= S.top2; i--)cout<<S.s[i]<<' ';cout<<endl;}//判斷棧是否為空白,flag為0表示對第1個棧進行操作,flag為1表示對第2個棧進行操作bool Stack2_Empty(stack2 &S, bool flag){if(flag == 0 && S.top1 < 1)return 1;if(flag == 1 && S.top2 > S.len)return 1;return 0;}//入棧,flag為0表示對第1個棧進行操作,flag為1表示對第2個棧進行操作void Push(stack2& S, int value, bool flag){//已滿if(S.top1 > S.top2){cout<<"error:overflow"<<endl;return;}//對棧1操作if(flag == 0){//topS.top1++;S.s[S.top1] = value;}//對棧2操作else{S.top2--;S.s[S.top2] = value;}}//出棧,flag為0表示對第1個棧進行操作,flag為1表示對第2個棧進行操作int Pop(stack2 &S, bool flag){int ret;//對棧1操作if(flag == 0){//棧1為空白if(S.top1 < 0){cout<<"error:underflow"<<endl;return -1;}else{ret = S.s[S.top1];S.top1--;}}//對棧2操作else{//棧2為空白if(S.top2 > S.len){cout<<"error:underflow"<<endl;return -1;}else{ret = S.s[S.top2];S.top2++;}}return ret;}