ADT - 兩個棧共享一個數組
阿新 • • 發佈:2017-10-08
ray () != ret con div pty for clas
大晚上實在睡不著,就去碼代碼...然後想起這個我一直沒寫過,就想試試,然後實現了這個數據結構,因為不知道對這個題目理解對不對...所以如果不正確,還望不吝指正。
寫的時候倒是沒有什麽難的地方,然後寫完之後幾乎一次編譯就過了,hhh,實際上還是有幾個標點符號忘記寫。。。也算有一點進步吧~
/** * 一個數組實現兩個棧 * */ #include <stdio.h> #include <stdlib.h> #include <conio.h> #define bool int #define false 0 #define true 1 #define ArrayMax 10 #define Empty -1 typedef struct ArrStack { int* val; int base; //棧1底 int top; //棧2底 }TwoStack; /*初始化棧*/ TwoStack* initStack(void) { TwoStack* stack; stack = (TwoStack*)malloc(sizeof(TwoStack)); stack->val = (int*)malloc(sizeof(int)); stack->base = -1; stack->top = ArrayMax; return stack; } /**判斷棧1是否為空的條件*/ bool EmptyStack_1(TwoStack* stack) { return stack->base == Empty; } /**判斷棧2是否為空的條件*/ bool EmptyStack_2(TwoStack* stack) { return stack->top == ArrayMax; } /** * 判斷棧是否滿 * */ bool FullStack(TwoStack* stack) { return stack->base + 1 == stack->top; //滿足數組大小 } /**棧1-進棧*/ bool PushStack_1(TwoStack* stack, int X) { if(FullStack(stack)) { fprintf(stderr,"Stack overflow!\n"); return false; } stack->val[++stack->base] = X; return true; } /**棧2-進棧*/ bool PushStack_2(TwoStack* stack, int X) { if(FullStack(stack)) { fprintf(stderr,"Stack overflow!\n"); return false; } stack->val[--stack->top] = X; return true; } /**棧1-出棧*/ bool PopStack_1(TwoStack* stack) { if(EmptyStack_1(stack)) { return false; } --stack->base; return true; } /**棧2-出棧*/ bool PopStack_2(TwoStack* stack) { if(EmptyStack_2(stack)) { return false; } ++stack->top; return true; } /**獲取棧1的頂*/ int GetTopStack_1(TwoStack * stack) { return stack->base; } /**獲取棧2的頂*/ int GetTopStack_2(TwoStack * stack) { return stack->top; } int main(void) { TwoStack* Stack; int i; int X; char c; Stack = initStack(); puts("1) 進棧1 2) 進棧2"); puts("3) 出棧1 4) 出棧2"); puts("5) 棧1頂元素 6) 棧2頂元素"); puts("7) 查看棧1 8) 查看棧2"); puts("9) 退出"); while((c = getch()) != ‘9‘) { switch(c) { case ‘1‘ : printf("\n棧1—輸入數據:"); scanf("%d", &X); PushStack_1(Stack, X); break; case ‘2‘ : printf("\n棧2—輸入數據:"); scanf("%d", &X); PushStack_2(Stack, X); break; case ‘3‘ : printf("棧1—出棧\n"); PopStack_1(Stack); break; case ‘4‘ : printf("棧2—出棧\n"); PopStack_2(Stack); break; case ‘5‘ : printf("當前棧1—頂元素為: %d\n", Stack->val[GetTopStack_1(Stack)]); break; case ‘6‘ : printf("當前棧2—頂元素為: %d\n", Stack->val[GetTopStack_2(Stack)]); break; case ‘7‘ : printf("棧1—所有元素為:"); for(i = 0; i <= GetTopStack_1(Stack); i++) printf("%d ", Stack->val[i]); printf("\n"); break; case ‘8‘ : printf("棧2—所有元素為:"); for(i = ArrayMax - 1; i >= Stack->top; i--) printf("%d ", Stack->val[i]); printf("\n"); break; } } free(Stack); free(Stack->val); return 0; }
時間也不早了,先休息了 = =
最後,謝謝觀看~~
ADT - 兩個棧共享一個數組