🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 定义 只能在表的一端(栈顶)进行插入和删除运算的线性表 ### 逻辑结构 一对一关系 ### 存储结构 用顺序栈或链栈存储均可,但以顺序栈更常见 ![栈示意图](https://box.kancloud.cn/2016-02-25_56ce7d1f37242.jpg "") ### 运算规则 只能从栈顶运算,且访问结点时依照后进先出(LIFO)或后进后出(FILO)的原则 ### 实现方法 关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同 ### 基本操作 - 入栈 - 出栈 - 读栈顶元素值 - 建栈 - 判断栈满 - 栈空 ### 栈与一般线性表的区别 栈是一种特殊的线性表,它只能在表的一端(栈顶)进行插入或删除运算 | ** | 一般线性 表 | 栈 | |-----|-----|-----| | 逻辑结构 | 一对一 | 一对一 | | 存储结构 | 顺序表、链表 | 顺序栈、链栈 | | 运算规则 | 随机、顺序存储 | 后进先出 | ### 它们之间在于运算规则不同 ![栈顶栈底](https://box.kancloud.cn/2016-02-25_56ce7d1f5060d.jpg "") > 我们在平常的程序设计中,如果需要按照保存数据时相反的顺序来使用数据,可以利用栈来实现。 ### 顺序栈的表示 ~~~ #define MAXSIZE 100 typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; ~~~ stacksize 指示栈的最大容量;base为栈底指针,它始终指向栈底位置,若base的值为NULL,则表明栈结构不存在;top为栈顶指针,其初值指向栈底,即top=base可作为栈空的标记。每当插入新的栈顶元素时,指针top增加1;删除栈顶元素时,指针top减1.因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。 base == top 是栈空的重要标志 ### 栈满时的处理方法 1. 报错,返回操作系统。 1. 分更大的空间,作为栈的存储空间,将原栈的内容移入新栈。 ### 初始化 ![顺序栈](https://box.kancloud.cn/2016-02-25_56ce7d1f634ce.jpg "") (1)分配空间并检查空间是否分配失败,若失败则返回错误 (2)设置栈底和栈顶指针 S.top = S.base; (3)设置栈大小 【算法描述】 ~~~ Status InitStack(SqStack &S) { S.base=new SElemType[MAXSIZE]; if(!S.base) return OVERFLOW; S.top=S.base; S.stackSize=MAXSIZE; return OK; } ~~~ ### 判断顺序栈是否为空 ~~~ bool StackEmpty(SqStack S) { if(S.top == S.base) return true; else return false; } ~~~ ### 求顺序栈的长度 ~~~ int StackLength(SqStack S) { return S.top-S.base; } ~~~ ### 清空顺序栈 ~~~ Status ClearStack(SqStack S) { if(S.base)S.top = S.base; return OK; } ~~~ ### 销毁顺序栈 ~~~ Status DestroyStack(SqStack &S) { if(S.base) { delete S.base; S.stacksize = 0; S.base = S.top =NULL; } return OK; } ~~~ ### 顺序栈进栈 (1)判断是否栈满,若满则出错 (2)元素e压入栈顶 (3)栈顶指针加1 ~~~ Status Push(SqStack &S,SElemType e) { if(S.top - S.base == S.stacksize)//栈满 return ERROR; *S.top=e; S.top++; return OK; } ~~~ ### 顺序栈出栈 (1)判断是否栈空。若空则出错 (2)获取栈顶元素e (3)栈顶指针减1 Status Pop(SqStack &S,SElemType &e) { if(S.top == S.base)//栈空 return ERROR; –S.top; e= *S.top; return OK; } ### 取顺序栈栈顶元素 判断是否为空栈,若为空则返回错误 否则通过栈顶指针获取栈顶元素 ~~~ Status GetTop(SqStack S,SElemType &e) { if(S.top == S.base) return ERROR;//栈空 e = *(S.top-1); return OK; } ~~~