#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100//存储空间初始分配量 #define STACKINCREMENT 10//存储空间分配增量 #define SElemType int typedef struct { SElemType *base;//栈底 SElemType *top;//栈顶指针 int stacksize;//当前已分配的存储空间,以元素为单位; }SqStack; void InitStack(SqStack &s)//构建一个空栈s { s.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!s.base) { printf("构建空栈时失败"); exit(-1); } s.top=s.base; s.stacksize=STACK_INIT_SIZE; } void DestoryStack(SqStack &s)//销毁栈s { free(s.base); } void ClearStack(SqStack &s)//把s置为空栈 { s.top=s.base; } int StackLength(SqStack s)//栈中元素个数 { return s.top-s.base; } bool StackEmpty(SqStack s)//判断一个栈是否为空 { if(s.top==s.base) return true; else return false; } void GetTop(SqStack s,SElemType &e)//用e返回栈顶元素 { if(StackEmpty(s)) { printf("栈空"); exit (-1); } e=*(s.top-1); } void Push(SqStack &s,SElemType e)//插入新元素e { if(s.top-s.base>=s.stacksize)//栈满则追加存储空间 { s.base=(SElemType*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!s.base) { printf("栈满时重新分配空间失败"); exit(-1); } s.top=s.base+s.stacksize; s.stacksize+=STACKINCREMENT; } *s.top=e; s.top++; } void Pop(SqStack &s,SElemType &e)//删除栈顶元素并用e返回其值 { if(StackEmpty(s)) { printf("栈空\n"); exit (-1); } e=*(s.top-1); s.top--; } void Visit(SqStack s)//从栈底到栈顶遍历 { if(StackEmpty(s)) { printf("栈空"); exit(-1); } SElemType *p=s.base; while(p!=s.top) { printf("%d ",*p); p++; } printf("\n"); }int main() { int e; SqStack s; InitStack(s); Push(s,1); Push(s,2); Push(s,3); Visit(s); GetTop(s,e); printf("%d\n",e); Pop(s,e); Pop(s,e); printf("%d\n",e); ClearStack(s); Visit(s); DestoryStack(s); }
栈的顺序存储的代码实现
最新推荐文章于 2023-07-17 15:55:19 发布