前、中、后缀表达式
下述讨论只考虑非负整数情况
前缀表达式求值
- 前缀表达式 : 操作符在操作数前面的表达式
- 从右至左(操作数先开始)依次扫描, 遇到操作数压入栈中, 遇到操作符op, 弹出栈顶两个元素,
栈顶元素 op 次栈顶元素
, 计算结果再次压入栈中.直到全部扫描完毕
/*
* 只考虑+ - * /四种情况
*/
int preval(string s)
{
reverse(s.begin(), s.end());
stack<int> sk;
for(char c: s)
{
if (c >= '0' && c <= '9')
sk.push(int(c) - int('0'));
else
{
int val1 = sk.top();
sk.pop();
int val2 = sk.top();
sk.pop();
if (c == '+')
sk.push(val1 + val2);
else if (c == '-')
sk.push(val1 - val2);
else if (c == '*')
sk.push(val1 * val2);
else if (c == '/')
sk.push(val1 / val2);
}
}
return sk.top();
}
后缀表达式求值
- 后缀表达式 : 操作符在操作数后面
- 从左至右依次扫描 (从操作数开始), 遇到操作数压入栈, 遇到操作符, 弹出栈顶两个元素,
次栈顶元素 op 栈顶元素
int postval(string s)
{
stack<int> sk;
for(char c: s)
{
if (c >= '0'