第3章栈的表示及实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5. 基本操作: 建栈、判断栈满或栈空、入栈、出栈、读
栈顶元素值,等等。
3
栈的顺序存储结构
例如: 栈 S= (a1, a2 a1称为栈底元素
,
a3,
………,an-1,
an )
an称为栈顶元素
插入元素到栈顶的 操作,称为入栈。
栈顶
栈底
an ... a3 a2 a1
从栈顶删除最后一 个元素的操作,称 为出栈。
顺序栈的基本操作——建栈初始化
/* 创建空栈s,若创建成功返回1,否则返回0 */ int InitStack(SqStack *s) 算法分析:
7
3.1.1 栈的抽象数据类型定义
ADT Stack{ 数据对象:D={ai|ai∈ElemSet,i=1,2,...,n,n≥0} 数据关系:R={<ai-1,ai>|ai-1,ai∈D,i=2,...,n} 基本操作: InitStack(&S) //构建一个空栈S DestoryStack(&S) //销毁栈S ClearStack(&S) //清空栈S StackEmpty(&S) //判断栈S是否为空 StackLength(S) //获取栈中元素个数 GetTop(S,&e) //用e返回栈S的栈顶元素 Push(&S,e) //插入元素e为新的栈顶元素 Pop(&s,&e) //删除栈顶元素,并用e返回其值 StackTraverse(S,visit()) //调用visit方法,访问站内所有元素 } ADT Stack
6
例 3:
设依次进入一个栈的元素序列为c,a,b,d,则 1 , 2, 3, 4 可得到出栈的元素序列是: A)a,b,c,d 2 , 3 , 1, 4 C)b,c,d,a 3 , 1, 4, 2 A)、D) B)c,d,a,b 1 , 4, 2, 3 D)a,c,d,b 2 , 1 , 4, 3
0 base top
base
B A
出栈
进栈(A、B、C、D、E、F)
栈满: s.top-s.base=s.stacksize
栈空: s.top=s.base
11
3.1.2 栈的表示与实现 ***
顺序栈的储存表示 顺序栈的基本操作 建栈初始化:InitStack(SqStack s) 判断栈满 :StackEmpty(SqStack s) 判断栈空 :StackFull(SqStack s) 入栈:Push(SqStack *s,SElemType e) 出栈: Pop(SqStack *s,SElemType *e) 访问栈中元素StackTraverse(SqStack s,void visit())
第三章 栈和队列
问题提出
问题1:食堂打饭队伍
队列Leabharlann Baidu
食堂打饭队伍是线性结构吗? 它运算规则和线性表一样吗?
银行叫号系统、医院挂号系统..... 特点:是线性结构,但是只能在一端插入,在另一端删除, “先进先出”。
栈 问题2:word中的提供的撤销/恢复功能如何实现的?
word中用户的操作步骤是线性结构吗? 它的运算规则和线性表一样吗?
4
例1:一个栈的输入序列为1,2,3,若在入栈的过程 中允许出栈,则可能得到的出栈序列是什么? 可以通过穷举所有可能性来求解:
① 1入1出, 2入2出,3入3出, 即123;
② 1入1出, 2、3入,3、2出, 即132 ; ③ 1、2入,2出, 3入3出,1出 即231 ; ④ 1、2入,2、1出,3入3出, ⑤ 1、2、3入,3、2、1出, 即213 ; 即321 ;
8
3.1.2 栈的表示与实现 ***
顺序栈的储存表示 顺序栈的基本操作 建栈初始化:initstack(SqStack s) 判断栈满 :stackempty(SqStack s) 判断栈空 :stackfull(SqStack s) 入栈:Push(SqStack *s,e) 出栈: Pop(SqStack *s,SElemType *e) 访问栈中元素StackTraverse(SqStack s,void visit())
栈顶指针
an
...
a2 栈底指针 a1
10
栈顶指针与栈中元素的关系
栈满 top 5 4 3 2 1 top top top top top F E D C B A 栈空 top top top top top top top F E D C
5
4 3 2 1 0
5
4 3 2 1 0
base
top
空栈
弹夹中子弹的放入与取出、物流车货物的装卸、网页的后 退功能。 特点:是线性结构,但是删除和插入操作只能在一端进行, “后进先出”。
第三章 栈和队列
3.1 栈(Stack) 3.2 队列(Queue)
1. 2. 3. 4. 5.
定义 逻辑结构 存储结构 运算规则 基本操作
1. 2. 3. 4. 5.
5
合计有5种可能性。
例2:一个栈的输入序列是12345,若在入栈的过程 中允许出栈,则栈的输出序列43512和12345有可能 实现吗? 思考:有无通用 的判别原则? 43512 不可能实现
主要是其中的12顺序不能实现
12345 可以实现 每压入一数便立即弹出即可。
对于出栈序列中的每一个数字,在它后面的、比它 小的所有数字,一定是按递减顺序排列的。
顺序栈的储存表示
#define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 typedef struct{ SElemType *base; //栈的基址即栈底指针 SElemType *top; //栈顶指针 int stacksize; //当前分配的空间 }SqStack;
定义 逻辑结构 存储结构 运算规则 基本操作
2
3.1 栈
1. 定义:
即栈顶
限定只能在表的一端进行插入和删除运 算的线性表。 2.逻辑结构: 与线性表相同,仍为一对一( 1:1)关系。
3. 存储结构: 用顺序栈或链栈存储均可,顺序栈更常见
4. 运算规则: 只能在栈顶运算,且访问结点时依照后进
先出(LIFO)或先进后出(FILO)的原则。