1.任务:
输入语法正确的表达式,求值
操作数:123456789 double 操作符:+ - * / ( ) char
2.核心思想:
(1).应用栈,链栈。一个栈存储操作数,一个栈存储操作符。
(2).把输入的表达式存储在字符数组中,再扫描数组。
a.如果是操作数,入操作数栈;
b.如果是操作符,若栈顶操作符为空则将当前操作符直接入栈;否则比较扫描的当前操作符和栈顶操作符 ;
栈顶操作符一定比当前操作符先出现
比较规则:
同级运算从左到右;
先乘除,后加减
先括号内再括号外
得到一个栈顶操作符与当前操作符优先级的表:
'<'栈顶优先级较低
'='左右括号相遇
'>'栈顶优先级高
c.若栈顶优先级低则将当前操作符直接入栈;
若左右括号相遇(栈顶是左括号,当前是右括号)则将栈顶括号出栈,当前括号不作处理;
若栈顶优先级高,则弹出栈顶操作符,第一次弹出栈顶数b作为第二个 (算式 的操作数),
第二次弹出栈顶数a作为第一个 (算式 的操作数),例a+b
计算完成后将结果入操作数栈,扫描指针减一使得当前操作符和栈顶操作符再比较一次,因为栈顶操作符已经变化了。
(3)扫描完成后,再
弹出栈顶操作符,第一次弹出栈顶数b作为第二个(算式 的操作数),
第二次弹出栈顶数a作为第一个(算式 的操作数),计算一次,因为操作符栈可能有剩一个操作符没处理。
(4)最后操作数栈的那个元素就是表达式计算结果
3.学习收获
(1)有关链栈的初始化,入栈,出栈,判空,获取栈顶元素的操作熟悉
(2)c++的值传递与引用传递的区别
(3)vs2019操作界面的熟悉