第3章 栈-算法与数据结构(第三版)-陈媛-清华大学出版社
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3
栈的基本操作
✓ INISTACK(S):初始化操作。设置一个空栈S。 ✓ EMPTY(S):判栈空函数。若S为空栈,函数值为1,否则为0 ✓ SIZE(S):求栈深函数。函数值为栈中当前的元素个数。 ✓ TOP(S):读栈顶元函数。若栈S不空,函数值为栈顶元素,否
则为空元素NULL。 ✓ PUSH(S,x):进栈操作。将元素x插入栈S中,使x成为栈S的
6
#+*
124
2
栈的示意图
插入和删除都只在表的一端(栈顶)进行
栈 S= (a1 , a2 , a3 , ……….,an-1 , an )
栈底元素
栈顶元素
✓栈是仅在表尾进行插入、删除操作的线性表 ✓表尾(即 an 端)称为栈顶 (top) ✓表头(即 a1 端)称为栈底(bottom) ✓插入元素到栈顶的操作,称为入栈 ✓从栈顶删除元素的操作,称为出栈
└───┘ ④
✓ 分别存放表达式中的运算 符和操作数
14
利用算法对算术表达式求值的操作过程
步骤 OPTR栈 OPND栈 输入字符
──────────────────────────
1
#
1+2*4-9/3#
2
#
1
+2*4-9/3#
3
#+
1
2*4-9/3#
4
#+
12
*4-9/3#
5
#+*
12
4-9/3#
栈顶元素。 ✓ POP(S):出栈函数。若栈S不空,函数值为栈顶元素,且从栈
中删除当前栈顶元素,否则函数值为空元素NULL。 ✓ CLEAR(S):栈置空操作。不论栈S是否为空栈,将S置为空栈
4
✓ 十进制数转换成二进制数 ✓ 把所有的余数按出现的逆序排列起来(先出现
的余数排在后面,后出现的余数排在前面),十 进制数35转换成二进制数
第三章 栈和队列
✓栈 ✓ 栈的存储结构及应用 ✓ 队列 ✓ 队列的存储结构及应用
1
栈的基本概念
定 义 只能在表的一端进行插入和删除的线性表 逻辑结构 数据元素之间是一对一的关系 存储结构 顺序存储或链式存储
运算规则
只能在栈顶运算,且访问结点时依照后进先 出(LIFO)或先进后出(FILO)的原则
基本操作 建栈、判断栈满或栈空、入栈、出栈、 取栈顶元素值
9
顺序栈上实现的操作
✓ 初始化(栈置空)操作
✓ void ini_sqstack(sqstacktp *s);
✓ 判栈空函数
✓ int empty_sqstack(sqstacktp *s);
✓ 进栈操作
✓ void push_sqstack(sqstacktp *s,elemtype x);
✓ 出栈函数 ✓ elemtype pop_sqstack(sqstacktp *s) ;
}linkstack;
✓ linkstack *ls;
A NULL 栈底
✓ ls=(linkstack *)malloc(sizeof(linkstack));
✓ ls->top=?
12
链栈上实现的操作
✓ 初始化操作
✓ void init_linkstack(linkstack *ls);
✓ 进栈操作
✓ 求栈深函数
✓ int size_sqstack(sqstacktp *s);
✓ 读栈顶元函数
✓ elemtype top_sqstack(sqstacktp *s);
10
栈的链式存储结构
✓ 定义 ✓ 栈的链式存储结构,简称链栈 ✓ 组织形式与单链表类似,链表的尾部是栈底 ,链表的头部是栈顶
11
栈的链式存储结构
✓ 链栈的类型定义: ✓ typedef struct stacknode
data next
top
F
栈顶
✓ { elemtype data;
✓ struct stacknode *next;
E
✓ }stacknode;
D
✓ typedef struct
✓ { stacknode *top; //栈顶指针
✓ void push_linkstack(linkstack *ls,elemtype x);
✓ 出栈操作
✓ elemtype pop_linkstack(linkstack *ls);
13
栈的应用实例—表达式求值 ?扩展:多位数、()
对算术表达式求值:
✓ 采用“运算符优wenku.baidu.com数法”
1+2*4-9/3
✓ 对每种运算符赋于一个优
遵循先乘除后加减、先
先数,如:
左后右及先括号内,后 ✓ 运算符: * / + - #
括号外的四则运算法则, ✓ 优先数: 2 2 1 1 0
其计算顺序应为:
✓ 其中 # 是表达式结束符
1+2*4-9/3 └─┘ └┘ ①②
└─┘ ③
✓ 对表达式求值时,一般设 立两个栈
✓ 运算符栈(OPTR) ✓ 操作数栈(OPND)
an ……
ai
素而变化
✓用一个整型变量top来
指示栈顶的位置
0
…… a2 a1
栈底
压入(PUSH): S[top++]=an+1 弹出( POP) : e=S[--top]
7
顺序栈存储结构的描述
✓ #define MAXSIZE 100 ✓ typedef int elemtype; ✓ typedef struct stack ✓{ ✓ elemtype elem[MAXSIZE]; ✓ int top; //栈顶指针 ✓ }sqstacktp; //顺序栈类型定义 ✓ sqstacktp *s; //s为顺序栈类型变量的指针 ✓ s=(sqstacktp *)malloc(sizeof(sqstacktp));
35 17 8
4 2 1 0
余数 结果:10011
1 1 0 0 1
5
将带头结点的单链表(a1,a2,…,an)逆置
6
栈的顺序存储结构(顺序栈)
✓ 顺序栈:利用一组地址连续的存储单元依次存放从
栈底到栈顶的数据元素
顺序栈S 栈顶top
✓C语言中
n
✓预设较大的数组空间
✓栈底设为0
✓栈顶随插入和删除元
8
顺序栈的几种情况
设MAXSIZE=6 top
栈满
栈空
top
5 top 4 top
top F5
top E4
F5 E4
3 top
top D3
D3
top
2
top C2
C2
1 top
top
0 top
栈空
B1
A0
进栈
top
B1
top
A0
出栈
栈顶指针top,可初始 化为0,指向实际栈 顶后的空位置.
设数组大小为MAXSIZE s->top==0,栈空,此时出栈则下溢 s->top== MAXSIZE,栈满,此时入栈上溢