共享棧:所謂共享棧就是為了節省空間,讓兩個棧共享一片連續的存儲空間,兩個棧從這片連續的共享空間的兩端向中間擴充自己的存儲空間,設這片存儲空間的大小為maxSize,采用棧頂指針始終指向當前棧頂元素的方式來實現共享棧,那么初始棧空時,兩個棧的棧頂指針的值分別為:top1==-1,top2==MaxSize
對共享棧進行入棧操作和出棧操作很簡單,關鍵在于要記住——“入棧判滿,出棧判空”?
共享棧的C語言實現
-
共享棧數據結構定義
//假設棧的實現方式采用,棧頂指針始終指向當前的棧頂元素,也就是說判斷棧空的條件為top==-1 typedef struct ShareStack {ElemType data[MaxSize];int top[2]; //存儲兩個棧的棧頂指針 }*shareStack,St;
?
- 對共享棧進行初始化操作
//對共享棧進行初始化操作 void Initiate(shareStack Sta) {memset(Sta->data, 0, sizeof(Sta->data)); //將共享棧的數據元素全部初始化為0(Sta->top)[0] = -1;(Sta->top)[1] = MaxSize; }
? ? ? ? ? ??
-
對共享棧進行入棧操作?
//入棧操作 void Push(shareStack Sta,ElemType x) {//top[0]表示第一個棧的棧頂指針,初始時top[0]=-1,top[1]表示第二個棧的棧頂指針,初始時top[1]=MaxSizeint stack; //記錄當前需要對第幾個棧進行入棧操作printf("請輸入你要進行入棧操作的那個棧的序號,合法的輸入為0,1,分別表示第一個棧和第二個棧\n");scanf("%d", &stack);if (Sta->top[0] + 1 == Sta->top[1]){printf("棧滿,無法進行入棧操作\n");return;}switch (stack){case 0://對棧1進行入棧操作Sta->data[++(Sta->top[0])] = x;break;case 1://對棧2進行入棧操作Sta->data[--(Sta->top[1])] = x;} }
? ? ? ? ? ? ? ? ??
-
對共享棧進行出棧操作
//出棧操作 void Pop(shareStack Sta,ElemType &x) {int stack; //用于記錄你所需要進行出棧操作的棧的序號printf("請輸入你要進行出棧操作的那個棧的序號,合法的輸入為0,1,分別表示第一個棧和第二個棧\n");scanf("%d", &stack);switch (stack){case 0:if (Sta->top[0] == -1){printf("棧空,無法進行出棧操作\n");return;}x = Sta->data[(Sta->top[0])--];break;case 1:if (Sta->top[1] == MaxSize){printf("棧空,無法進行出棧操作\n");return;}x = Sta->data[(Sta->top[1])++];} }
?用switch語句代替if-else分支語句使程序更簡潔