顺序栈的兑现
顺序栈的实现
//栈的顺序表示实现 #include <stdio.h> #include <stdlib.h> //栈初始大小 #define STACK_INIT_SIZE 100 //栈的增长大小 #define STACKINCREMENT 10 #define OVERFLOW 0 #define ERROR 0 #define FALSE 0 #define TRUE 1 typedef int Status; typedef int SElemType; typedef int boolean; //栈的顺序定义 typedef struct{ SElemType *bese; //栈底指针,在栈构造之前和析构之后值都为NULL SElemType *top; //栈顶指针 int stacksize; //栈的大小 }Stack; //初始化栈 Stack InitStack() { Stack S; S.bese = (SElemType *)malloc(sizeof(SElemType) * STACK_INIT_SIZE); if(!S.bese) exit(OVERFLOW); S.top = S.bese; S.stacksize = STACK_INIT_SIZE; return S; } //若栈不为空,则返回栈顶元素e Status GetTop(Stack S) { //判断是否为空栈 if(S.bese == S.top) return ERROR; //非空栈的栈顶指针始终是在栈顶元素的下一个位置上 return *(S.top - 1); } //入栈操作,若栈满,则增加存储空间 Stack push(Stack S, SElemType e) { //判断栈是否已经满 if(S.top - S.bese >= STACK_INIT_SIZE) { S.bese = (SElemType *)realloc(S.bese, sizeof(SElemType) * (S.stacksize + STACKINCREMENT)); if(!S.bese) exit(OVERFLOW); S.top = S.bese + S.stacksize; //计算栈顶指针 S.stacksize += STACKINCREMENT; } *S.top++ = e; return S; } //入栈操作 Stack pop(Stack S) { //空栈 if(S.bese == S.top) { printf("此栈是空栈!"); return S; } S.top--; return S; } //销毁栈 Stack DestoryStack(Stack S) { S.bese = NULL; return S; } //清空栈中数据 Stack ClearStack(Stack S) { S.top = S.bese; return S; } //判断栈是否是空栈 boolean StackEmpty(Stack S) { if(S.bese == S.top) return TRUE; return FALSE; } //返回栈的长度 int StackLength(Stack S) { return S.top - S.bese; } int main() { //初始化栈 Stack S = InitStack(); for(int i = 0; i < 10; i++) { S = push(S, i); } printf("栈的长度为:%d\n", StackLength(S)); printf("栈顶元素为:%d\n", GetTop(S)); S = pop(S); printf("出栈后:\n"); printf("栈的长度为:%d\n", StackLength(S)); printf("栈顶元素为:%d\n", GetTop(S)); S = ClearStack(S); if(StackEmpty(S)) printf("此栈是空栈"); S = DestoryStack(S); return 0; }