C++的表达式求值用栈实现表达式求值,请问,出栈的是些什么数据?
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/20 15:29:55
C++的表达式求值用栈实现表达式求值,请问,出栈的是些什么数据?
C++的表达式求值
用栈实现表达式求值,请问,出栈的是些什么数据?
C++的表达式求值用栈实现表达式求值,请问,出栈的是些什么数据?
1、先读入一行表达式,用一个字符数组line[]存储
2、依次读入每个字符并进行处理同是进行表达式判错:
1.遇数字,则继续判断下一个字符,直到下一个字符不是数字且不是小数点,若该数含有两个小以上数点,则表示输入错误.否则即可保证该操作数是完整的浮点数,然后将该数入操作数栈.
若数字不是表达式的最后一位,且数字后面跟的不是“+、-、*、/、^、)”,则为表达式错误
2.遇运算符,则分两种情况:
1、若运算符为负号(该运算符为符号的情况有两种:一为负号在最开头,一为符号前面是“(” ),则先将0入操作数栈,然后再将负号入运算符栈.
2、该运算符不是负号则与运算符栈的栈顶元素比:
(1) 若栈顶元素优先级低,新输入的运算符入栈.
(2) 若栈顶元素优先级高,
1) 从符号栈弹出一个运算符,
2) 从对象栈弹出一个/两个操作数,
3) 运算结果压入对象栈.
(3) 优先级相等,则栈顶元素出栈,与输入元素对消.
若“(、+、-、*、/、^”放在表达式最后面,则表达式错误
若“+、-、*、/、^”后面跟的不是数字或者变量,表达式错误
3、遇字母变量,则继续判断下一个字符,直到下一个字符不是字母变量,即可保证该变量是完整的,然后输出“请输入变量的值”,再将输入的变量值入操作数栈.
若变量后面跟的不是“+、-、*、/、^、)”,则表达式错误
4、若所读的该字符不是上述情况中的一种,则表达式错误
3、当将所有的字符都读一遍之后,若表达式正确的话,则必然不含有“(”或者“)”.即若运算符栈中含有“(”或者“)”,则表达式必错误.再考虑表达式正确的情况:运算符栈可能为空,则操作符栈中必剩下一个操作数,即最后的结果.若不为空,则留在运算符栈中的运算符的优先级别从栈顶至栈底依次递减.故可从运算符栈顶开始弹出一个运算符,从操作数栈中弹出两个操作数进行运算,再将运算结果入操作数栈,一直循环至运算符栈为空.此时操作数栈剩下的唯一一个操作数就是运算结果.