顺序栈代码更清晰,只允许栈顶进出元素,改变相应数组下标值即可,使用非常方便。但缺点很明显,只要使用数组,必须事先声明数组存储大小,需要多大的空间要心里有数,所以可能会空间不够用。
解决办法:1、使用链式栈;2、如果需要两个相同类型的栈,可以公用空间。
如下图:
刚开始,top1为-1,top2为size,表示栈1栈2都为空。栈满的时候,栈顶指针挨着,即top1+1==top2;
代码
#include #include #define StackElem char#define SIZE 20typedef struct Stack{ StackElem * elem; int top1; //栈1的栈顶指针 int top2; //栈2的栈顶指针 int Size_Stack; //栈的最大长度}Stack,*StackPtr;void Stack_Init(StackPtr s); //初始化bool Stack_Push(StackPtr s,StackElem val,int StackNumber ); //val入栈,StackNumber表示哪个栈bool Stack_Pop(StackPtr s,int StackNumber); //出栈valvoid Stack_Traverse(StackPtr s,int StackNumber); //遍历int main(void){ Stack s; Stack_Init(&s); //push栈1 Stack_Push(&s, 1, 1); Stack_Push(&s, 2, 1); Stack_Push(&s, 3, 1); //push栈2 Stack_Push(&s, 7, 2); Stack_Push(&s, 8, 2); Stack_Push(&s, 9, 2); Stack_Traverse(&s, 1); printf("\n"); Stack_Traverse(&s, 2); return 0;}void Stack_Init(StackPtr s){ s->elem = (StackElem*)malloc(sizeof(Stack) * SIZE); if (NULL == s->elem) { printf("内存分配失败,程序结束!"); exit(-1); } s->top1 = -1; s->top2 = SIZE; s->Size_Stack = SIZE;}bool Stack_Push(StackPtr s,StackElem val, int StackNumber) {//val入栈,StackNumber表示哪个栈 if (s->top1 + 1 != s->top2) //说明栈没满 { if (StackNumber == 1) { s->top1++; s->elem[s->top1] = val; } else if (StackNumber == 2) { s->top2--; s->elem[s->top2] = val; } return true; } else { printf("栈已满,入栈失败!"); return false; }}bool Stack_Pop(StackPtr s,StackElem *val, int StackNumber) { if (StackNumber == 1) //栈1 { if (s->top1 != -1) //栈1不为空 { *val = s->elem[s->top1]; //存放出栈元素的值 s->top1--; return true; } else //栈1为空 { printf("栈1为空,出栈失败!"); return false; } } else if (StackNumber == 2) { if (s->top2 != SIZE) //栈2不为空 { *val = s->elem[s->top2]; s->top2++; return true; } else //栈2为空 { printf("栈2为空,出栈失败!"); return false; } }}void Stack_Traverse(StackPtr s, int StackNumber){ int i; if (StackNumber == 1) { for (i = s->top1; i > -1; i--) printf("%d ", s->elem[i]); } else if (StackNumber == 2) { for (i = s->top2; i < SIZE; i++) printf("%d ", s->elem[i]); }}
运行结果