ADT - 两个栈共享一个数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ADT - 两个栈共享一个数组相关的知识,希望对你有一定的参考价值。
大晚上实在睡不着,就去码代码...然后想起这个我一直没写过,就想试试,然后实现了这个数据结构,因为不知道对这个题目理解对不对...所以如果不正确,还望不吝指正。
写的时候倒是没有什么难的地方,然后写完之后几乎一次编译就过了,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 - 两个栈共享一个数组的主要内容,如果未能解决你的问题,请参考以下文章