标签:后缀 压栈 运算符 2019 2018 w1 20175203 表达式 w2
20175203 2018-2019 实验五《网络编程与安全》
任务一
要求
两人一组结对编程:
- 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
- 结对实现中缀表达式转后缀表达式的功能 MyBC.java
- 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
上传测试代码运行结果截图和码云链接
知识重点
- 栈 :(Stack)是一种只允许在表尾插入和删除的线性表,有先进后出(FILO),后进先出(LIFO)的特点。允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)
栈的一个应用是用来对四则运算表达式进行求值:
eg:表达式Exp = S1 + OP + S2
(S1 ,S2是两个操作数,OP为运算符)有三种标识方法:
OP + S1 + S2 为前缀表示法;S1 + OP + S2 为中缀表示法;S1 + S2 + OP 为后缀表示法
例如:Exp = a * b + (c - d / e) * f
前缀式: + * a b * - c / d e f
中缀式: a * b + c - d / e * f
后缀式: a b * c d e / - f * +
我们可以看出:
操作数之间的相对次序不变;
运算符的相对次序不同;
中缀式丢失了括弧信息,致使运算次序不确定;
前缀式的运算规则为:连续出现的两个操作数和在它们之前且紧靠它们的运算符构成一个最小表达式;
后缀式的运算规则为:运算符在式中出现的顺序恰为表达式的运算顺序;每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。后缀表示法是波兰逻辑学家J.Lukasiewicz于1929年提出的,又叫做逆波兰表达式。
Linux命令
dc
可以用来对逆波兰式表达式进行求值,dc
的打印类命令:p:打印栈顶元素并换行
n: 打印栈顶元素并将其弹出栈,完毕后不换行
P: putchar ( int(栈顶元素) % 256) 并弹栈顶,不换行
f: 从栈顶至栈底打印栈中所有值,每个一行
dc
的运算符:+: 依次弹出w1与w2,将w2+w1压栈。精度为结果值精度
c : 清空栈
-: 依次弹出w1与w2,将w2-w1压栈
: 依次弹出w1与w2,将w2w1压栈。精度为结果值精度与precision中较大值
/ : 依次弹出w1与w2,将w2/w1压栈。精度为precision
% : 依次弹出w1与w2,将w2-w2/w1*w1压栈
~ : 依次弹出w1与w2,依次将w2/w1与w2%w1压栈
^ : 依次弹出w1与w2,将w2^((int)w1)压栈。精度为w2精度与precision中较大值
| : 依次弹出w1 w2与w3,将 w3 ^ ((int)w2) (mod w1) 压栈。w1 w3 需为整数
v : 弹出w1,将sqrt(v)压栈。精度为precision
dc
支持栈操作:
d : 将栈顶元素复制并压栈
r : 交换栈顶两元素 XXX对逆波兰式求值时,不需要再考虑运算符的优先级,只需从左到右扫描一遍后缀表达式即可。求值伪代码如下:
设置一个操作数栈,开始栈为空;
从左到右扫描后缀表达式,遇操作数,进栈;
若遇运算符,则从栈中退出两个元素,先退出的放到运算符的右边,后退出的放到运算符左边,运算后的结果再进栈,直到后缀表达式扫描完毕。
此时,栈中仅有一个元素,即为运算的结果。
实验代码
标签:后缀,压栈,运算符,2019,2018,w1,20175203,表达式,w2 来源: https://www.cnblogs.com/20175203mayuda/p/10946269.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。