严蔚敏版数据结构学习笔记(3):栈
来源:互联网 发布:js节点操作 编辑:程序博客网 时间:2024/06/06 06:44
栈是只能在表尾进行插入和删除的一种简单一点的线性表。表尾端是栈顶(top),表头端是栈底(bottom),不含元素的称为空栈。因为我们只能对栈顶的元素进行插入和删除操作,所以栈这个数据结构就是一个很有”原则”的结构,栈的修改是按照后进先出的原则进行的,也就是LIFO(last in first on)。
可知栈也是可以有插入删除,当然也有栈的初始化,判空以及取栈顶的操作,下面来罗列一下
ADT Stack{
InitStack(&S)//构造一个空表
DestroyStack(&S)//销毁栈S
ClearStack(&S)//清除一个表S,清我一个空栈
StackEmpty(S)//若S为空栈,则返回TRUE,否则返回FALSE
StackLength(S)//返回栈中元素的个数,也就是栈的长度
GetTop(S,&e)//用e返回栈的栈顶元素
Push(&S,e)//插入元素e为新的栈顶元素
Pop(&S,&e)//删除S的栈顶元素,并用e返回其值
StackTraverse(S,visit)//从栈底到栈顶依次对S的每个数据元素调用visit();一旦visit()失败,则操作失效
}
相同的,栈也是分为顺序栈和链栈。
我们先来定义一个顺序栈:
typedef struct { SElemType *base; SElemType *top; int stacksize;}SqStack;
现在我们来试着实现构造一个空栈的操作:
Status InitStack(SqStack &s){ S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; }
接下来我们就要来试试数据结构中最常见的一个方法了,插入操作。
Status 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) exit(OVERFLOW); S.top = S.base + STACKINCREMENT; } *S.top++ = e; return OK; }
下面我们来看一下删除栈顶元素的操作:
Status Pop(SqStack &S,SElemType &e){//若栈不为空,那么删除S的栈顶元素,用e返回其值,并返回OK;否则就返回ERROR if(S.top == S.base) return ERROR; e = *--S.top; return OK;}
栈顶的删除是不是要简单的多呢,没错,相比线性表和链表,栈顶的删除只需要一个步骤,那就是把使栈顶减一即可;
栈还有一个操作就是返回栈顶元素的操作:
Status GetTop(SqStack &S,SElemType &e){//若S存在,用e来返回S的栈顶元素,并返回OK,否则就返回ERROR; if(S.top == S.base) return ERROR;//栈的判空操作是栈顶等于栈底也就是S.top == S.base e = *(S.top-1); return OK;}
既然线性表有他的顺序结构和链式结构,那么同样的我们的栈也有类似的链式结构:
那么他的操作门和顺序结构的有何不同呢.我会在接下来慢慢的实现链式栈的功能,并上载;
包括定义一个链式栈的结构体,初始化一个链式栈(InitStack()),返回栈顶元素(GetTop()),删除栈顶元素(Pop()),添加栈顶元素(Push())等
- 严蔚敏版数据结构学习笔记(3):栈
- 《数据结构》学习笔记(3)
- 数据结构学习笔记 --- 栈
- 数据结构栈 学习笔记
- 数据结构学习笔记--栈
- 数据结构学习笔记 --- 栈
- 数据结构学习笔记3
- 数据结构学习笔记3
- 数据结构学习笔记3
- 数据结构学习笔记3
- 严蔚敏版数据结构学习笔记(4):队列
- 严蔚敏版数据结构学习笔记(5):串
- 数据结构学习笔记 --- 栈、队列 (习题)
- 数据结构学习笔记5(栈)
- 数据结构-栈1(学习笔记)
- 数据结构-栈2(学习笔记)
- 数据结构学习笔记 --- 栈、队列 (习题)
- 数据结构学习笔记(1) 数据结构概论
- python发送邮件
- 【AngularJs】模块和控制器
- 如何让一个a标签的跳转失效
- Vue——路由定义及基本使用
- .\systick.axf: Error: L6320W: Ignoring --entry command. Cannot find argument 'Reset_Handler'.
- 严蔚敏版数据结构学习笔记(3):栈
- 蓝桥杯 算法训练 明明的随机数
- L2-003. 月饼
- mysql存储过程从表取数据存储到游标然后批量修改
- CodeForces
- innerHTML和innerText区别
- python之numpy对矩阵的操作
- 读取项目各个模块的版本号
- 起点