栈满isFull()-东南大学计算机科学与工程学院

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11
栈的应用:表达式求值
步 输入 类型
动作
栈中内容
1
置空栈
2 A 操作数 进栈
A
3 B 操作数 进栈
AB
4 C 操作数 进栈
ABC
5 D 操作数 进栈
ABCD
6 - 操作符 D、C退栈,计算R1=C-D进栈
A B R1
7 * 操作符 R1、B退栈,计算R2=B*R1进栈 A R2
8 + 操作符 R2、A退栈,计算R3=A+R2进栈 R3
6
栈的应用:表达式求值
一个表达式由操作数(亦称运算对象)、操作符 (亦称运算符) 和分界符组成。
算术表达式三种表示
中缀(infix)表示
<操作数> <操作符> <操作数>,如 A+B;
前缀(prefix)表示
<操作符> <操作数> <操作数>,如 +AB;
后缀(postfix)表示
步 输入 类型
动作
栈中内容
1
置空栈
2 A 操作数 进栈
A
3 B 操作数 进栈
AB
4 C 操作数 进栈
ABC
5 D 操作数 进栈
ABCD
6 - 操作符 D、C退栈,计算R1=C-D进栈
A B R1
7 * 操作符 R1、B退栈,计算R2=B*R1进栈 A R2
8 + 操作符 R2、A退栈,计算R3=A+R2进栈 R3
9 E 操作数 进栈
R3 E
10 F 操作数 进栈
R3 E F
11 / 操作符 F、E退栈,计算R4=E / F进栈
R3 R4
12 - 操作符 R4、R3退栈,计算R5=R3-R4进栈 R5
后缀表达式求值过程: ABCD- * +EF / -
top
F
top
E
top
R3=A+R2
16
栈的应用:表达式求值
10
栈的应用:表达式求值
后缀表达式求值过程
顺序扫描后缀表达式每一项 若该项是操作数,则进栈 若该项是操作符<op>,
若是单目运算符,则出栈一个操作数X,并将计算结 果<op>X进栈
若是双目运算符,则连续出栈两个操作数X和Y,并将 计算结果X <op> Y进栈
当表达式的所有项都扫描并处理完后,栈顶存放的 就是最后的计算结果。
#进栈
1 A 操作数
2 + 操作符 isp(#) < icp(+), 进栈
3 B 操作数
4 * 操作ຫໍສະໝຸດ Baidu isp(+) < icp(*), 进栈
5 ( 操作符 isp(*) < icp( ( ), 进栈 6 C 操作数 7 - 操作符 isp( ( ) < icp(-), 进栈
8 D 操作数 9 ) 操作符 isp(-) > icp( ) ), 退栈

top
*
top
+
top
#
top
空栈
21
栈的应用:表达式求值
步 输入 类型
动作
栈内容
0
#进栈
#
1 A 操作数
#
2 + 操作符 isp(#) < icp(+), 进栈 # +
3 B 操作数
#+
4 * 操作符 isp(+) < icp(*), 进栈 # + *
5 ( 操作符 isp(*) < icp( ( ), 进栈 # + * (
9 E 操作数 进栈
R3 E
10 F 操作数 进栈
R3 E F
11 / 操作符 F、E退栈,计算R4=E / F进栈
R3 R4
12 - 操作符 R4、R3退栈,计算R5=R3-R4进栈 R5
后缀表达式求值过程: ABCD- * +EF / -
R3=A+R2
top
R2=B*R1
top
A
top
空栈
15
栈的应用:表达式求值
空栈
18
栈的应用:表达式求值
中缀表达式转换为后缀表达式
使用栈将中缀表达式转换成前缀或后缀表达式。 为了实现转换,需要考虑各操作符的优先级。
结束符“#”优先级最低 左括号“(”栈外优先级最高,进栈后极低 右括号“)”栈外优先级极低 其他进栈后优先级加1,这可满足自左向右计算要求
第三章 栈与队列
东南大学计算机学院 方效林
本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件
本章主要内容
栈 栈的应用:表达式求值 栈与递归 队列 队列的应用:电路布线
2

定义:只允许在表的末端进行插入和删除的线 性表
特点:先进后出 栈的操作
进栈 push() 出栈 pop() 栈顶 top() 置空 setEmpty() 判断是否为空 isEmpty() 栈满 isFull()
入栈在表头进行插入操作
top
c
出栈在表头进行删除操作
b
a null
5

进栈顺序为(1,2,3),出栈顺序能否为(3,1,2)?
不能,3出栈时,说明2和1都在栈里,而且2必须
先于1出栈
top
3
2
1
作业: 1,2,3,4,5,6依次进栈,若出栈顺序为2,3,4,6,5,1 则栈大小至少为多少?
前缀和中缀表达式求值需要两个栈;后缀表达 式求值只需一个栈,相对简单些。
8
栈的应用:表达式求值
从左向右扫描表达式,用一个栈暂存扫描到的 操作数或计算结果。
后缀表达式的计算顺序中已隐含了加括号的优 先次序,括号在后缀表达式中不出现
中缀表达式:
A+B*(C-D)-E/F
R1
R4
R2
R3
R5
各个算术操作符的优先级
操作符
#
isp(栈内优先级)
0
icp(栈外优先级)
0
(
*/%
+-
1
5
3
6
4
2
)
6
1
19
栈的应用:表达式求值
中缀表达式转换为后缀表达式算法
操作符栈初始化,结束符#进栈,读入中缀表达式 的首字符ch
重复执行以下步骤,直到ch=#,同时栈顶操作符 也是#,停止循环
若ch是操作数直接输出,读入下一字符ch 若ch是操作符,比较ch和栈顶操作符op优先级:
9 E 操作数 进栈
R3 E
10 F 操作数 进栈
R3 E F
11 / 操作符 F、E退栈,计算R4=E / F进栈
R3 R4
12 - 操作符 R4、R3退栈,计算R5=R3-R4进栈 R5
后缀表达式求值过程: ABCD- * +EF / -
R2=B*R1
top
R1=C-D
top
B
top
A
14
栈的应用:表达式求值
3

栈的数组表示 栈的操作
进栈 push() 出栈 pop() 栈顶 top() 置空 makeEmpty() 判断是否为空 isEmpty() 栈满 isFull()
top
c
top
b
top
a
top
空栈
4

栈的单链表表示
栈的数组表示可能栈满
栈的单链表表示无栈满问题
9 E 操作数 进栈
R3 E
10 F 操作数 进栈
R3 E F
11 / 操作符 F、E退栈,计算R4=E / F进栈
R3 R4
12 - 操作符 R4、R3退栈,计算R5=R3-R4进栈 R5
后缀表达式求值过程: ABCD- * +EF / -
R1=C-D
top top top
D C B A
13
栈的应用:表达式求值
后缀表达式:
ABCD-*+EF/-
R1
R4
R2
R3
R5
9
作业: 写出下列中缀表达式的后缀表达式 1. A*B*C 2. -A+B-C+D 3. A*(-B)+C 4. (A+B)*D+E/(F+A*D)+C 5. A&&B||!(E>F) 6. !(A && !((B<C) || (C>D))) || (C<E)
步 输入 类型
动作
栈中内容
1
置空栈
2 A 操作数 进栈
A
3 B 操作数 进栈
AB
4 C 操作数 进栈
ABC
5 D 操作数 进栈
ABCD
6 - 操作符 D、C退栈,计算R1=C-D进栈
A B R1
7 * 操作符 R1、B退栈,计算R2=B*R1进栈 A R2
8 + 操作符 R2、A退栈,计算R3=A+R2进栈 R3
步 输入 类型
动作
栈中内容
1
置空栈
2 A 操作数 进栈
A
3 B 操作数 进栈
AB
4 C 操作数 进栈
ABC
5 D 操作数 进栈
ABCD
6 - 操作符 D、C退栈,计算R1=C-D进栈
A B R1
7 * 操作符 R1、B退栈,计算R2=B*R1进栈 A R2
8 + 操作符 R2、A退栈,计算R3=A+R2进栈 R3
#+
ABCD-*
#
ABCD-*+
#-
ABCD-*+
#-
ABCD-*+E
中缀表示转换为后缀表示过程:
A+B* (C-D)-E/F
后缀输出: ABCD- * +
12 / 操作符 isp(-) < icp(/), 进栈 # - / ABCD-*+E
13 F 操作数
# - / ABCD-*+EF
步 输入 类型
动作
栈中内容
1
置空栈
2 A 操作数 进栈
A
3 B 操作数 进栈
AB
4 C 操作数 进栈
ABC
5 D 操作数 进栈
ABCD
6 - 操作符 D、C退栈,计算R1=C-D进栈
A B R1
7 * 操作符 R1、B退栈,计算R2=B*R1进栈 A R2
8 + 操作符 R2、A退栈,计算R3=A+R2进栈 R3
<操作数> <操作数> <操作符>,如 AB+;
7
栈的应用:表达式求值
中缀表达式:A + B * ( C - D ) - E / F 后缀表达式:A B C D - * + E F / 表达式中相邻两个操作符的计算次序为:
优先级高的先计算; 优先级相同的自左向右计算; 当使用括号时从最内层括号开始计算。
6 C 操作数
#+*(
7 - 操作符 isp( ( ) < icp(-), 进栈 # + * ( -
8 D 操作数
#+*(-
9 ) 操作符 isp(-) > icp( ) ), 退栈 # + * (
isp( ( ) == icp( ) ), 退栈 # + *
后缀输出
A A AB AB AB ABC ABC ABCD ABCD– ABCD-
若icp(ch) > isp(op),令ch进栈,读入下一字符ch 若icp(ch) < isp(op),退栈,并输出 若icp(ch)==isp(op),退栈不输出;若退出的是(,则读入
下一个字符ch
算法结束,输出序列即为所得后缀表达式
20
栈的应用:表达式求值
步 输入 类型
动作
0
步 输入 类型
动作
栈中内容
1
置空栈
2 A 操作数 进栈
A
3 B 操作数 进栈
AB
4 C 操作数 进栈
ABC
5 D 操作数 进栈
ABCD
6 - 操作符 D、C退栈,计算R1=C-D进栈
A B R1
7 * 操作符 R1、B退栈,计算R2=B*R1进栈 A R2
8 + 操作符 R2、A退栈,计算R3=A+R2进栈 R3
中缀表示转换为后缀表示过程:
A+B* (C-D)-E/F
后缀输出: ABCD-
top
-
top

top
*
+
#
22
栈的应用:表达式求值
步 输入 类型
动作
10 - 操作符 isp(*) > icp(-), 退栈
isp(+) > icp(-), 退栈
isp(#) > icp(-), 进栈
11 E 操作数
栈内容 后缀输出
步 输入 类型
动作
栈中内容
1
置空栈
2 A 操作数 进栈
A
3 B 操作数 进栈
AB
4 C 操作数 进栈
ABC
5 D 操作数 进栈
ABCD
6 - 操作符 D、C退栈,计算R1=C-D进栈
A B R1
7 * 操作符 R1、B退栈,计算R2=B*R1进栈 A R2
8 + 操作符 R2、A退栈,计算R3=A+R2进栈 R3
9 E 操作数 进栈
R3 E
10 F 操作数 进栈
R3 E F
11 / 操作符 F、E退栈,计算R4=E / F进栈
R3 R4
12 - 操作符 R4、R3退栈,计算R5=R3-R4进栈 R5
后缀表达式求值过程: ABCD- * +EF / -
R4=E/F
top
F
top
E
top
R3=A+R2
17
栈的应用:表达式求值
9 E 操作数 进栈
R3 E
10 F 操作数 进栈
R3 E F
11 / 操作符 F、E退栈,计算R4=E / F进栈
R3 R4
12 - 操作符 R4、R3退栈,计算R5=R3-R4进栈 R5
后缀表达式求值过程: ABCD- * +EF / -
R5=R3-R4
top
R4=E/F
top
R3=A+R2
top
isp(( ) == icp( )), 退栈
栈内容 # # #+ #+ #+* #+*( #+*( #+*(#+*(#+*( #+*
后缀输出
A A AB AB AB ABC ABC ABCD ABCD– ABCD-
中缀表示转换为后缀表示过程:
A+B* (C-D)-E/F
后缀输出: ABC
top
-
top
9 E 操作数 进栈
R3 E
10 F 操作数 进栈
R3 E F
11 / 操作符 F、E退栈,计算R4=E / F进栈
R3 R4
12 - 操作符 R4、R3退栈,计算R5=R3-R4进栈 R5
后缀表达式求值过程: ABCD- * +EF / -
top
D
top
C
top
B
top
A
top
空栈
12
栈的应用:表达式求值
相关文档
最新文档