/*
中缀表达式 to 后缀表达式
从左到右扫描中缀表达式。用栈存放表达式中的操作数、开括号以及在此开括号后暂不确定计算次序的其他符号:
(1) 当输入为操作数时,直接输出到后缀表达式序列;
(2) 当遇到开括号时,将其入栈;
(3) 当输入遇到闭括号时,先判断栈是否为空,若为空(括号不匹配),应该作为错误异常处理,清栈退出。 若非空,则把栈中元素依次弹出,直到遇到第一个开括号为止,将
弹出的元素输出到后缀表达式序列中(弹出的开括号不放到序列中),若没有遇到开括号,说明括号不配对,做异常处理,清栈退出;
(4) 当输入为运算符op( 四则运算 + - * / 之一)时
(a) 循环 当(栈非空 and 栈顶不是开括号 and 栈顶运算符的优先级不低于输入的运算符的优先级)时,反复操作将栈顶元素弹出,放到后缀表达式序列中;
(b) 将输入的运算符压入栈内;
(5) 当中缀表达式的符号全部读入时,若栈内仍有元素,把它们全部依次弹出,放在后缀表达式序列的尾部。若弹出的元素遇到开括号,则说明括号不匹配,做异常处理,清栈退出。
后缀表达式求值
循环:依次顺序读入表达式的符号序列(假设以=作为输入序列的结束),并根据读入的元素符
号逐一分析:
1. 遇到操作数,则将其压入栈顶;
2. 遇到运算符, 则从栈中两次取出栈顶,按照运算符对这两个操作数进行计算。将计算结果压入栈顶如此继续,直到遇到符号=, 这时栈顶的值就是输入表达式的值
*/
/*
中缀表达式的值
查看 提交 统计 提问
总时间限制: 200ms 内存限制: 1024kB
描述
人们熟悉的四则运算表达式称为中缀表达式,例如(23+34*45/(5+6+7))。在程序设计语言中,可以利用堆栈的方法把中缀表达式转换成保值的后缀表达式(又称逆波兰表示法),并最终变为计算机可以直接执行的指令,得到表达式的值。
给定一个中缀表达式,编写程序,利用堆栈的方法,计算表达式的值。
输入
第一行为测试数据的组数N
接下来的N行,每行是一个中缀表达式。表达式中只含数字、四则运算符和圆括号,操作数都是正整数,数和运算符、括号之间没有空格。中缀表达式的字符串长度不超过600。
输出
对每一组测试数据输出一行,为表达式的值
样例输入
3
3+5*8
(3+5)*8
(23+34*45/(5+6+7))
样例输出
43
64
108
提示
注意:运算过程均为整数运算(除法运算'/'即按照C++定义的int除以int的结果,测试数据不会出现除数为0的情况),输出结果也为整数(可能为负)。
中间计算结果可能为负。
*/
#include <cstdlib>
#include <cstring>
#include <string>
#include <iostream>
#include <stack>
using namespace std;
int main()
{
int n = 0;
string str;
cin >> n;
for(int i = 0; i < n; ++i)
{
cin >> str;
string res[610];
int res_cur = 0;
string strg[610];
stack <string> ch_stk;
for(int j = 0; j < str.length(); ++j)
{
if (str[j] >= '0' && str[j] <= '9')
{
res[res_cur] = str[j];
int temp = j + 1;
while(temp < str.length() && str[temp] >= '0' && str[temp] <= '9')
{
res[res_cur].append(1, str[temp]);
++temp;
}
j = temp - 1;
res_cur++;
}
else if (str[j] == '(')
{
string str_temp(1, str[j]);
ch_stk.push(str_temp);
}
else if (str[j] == ')')
{
if (ch_stk.empty())
{
break;
}
while (ch_stk.top() != "(")
{
res[res_cur] = ch_stk.top();
res_cur++;
ch_stk.pop();
}
if(ch_stk.empty())
{
break;
}
else ch_stk.pop();
}
else if(str[j] == '+' || str[j] == '-' || str[j] == '*' || str[j] == '/')
{
while (!ch_stk.empty() && (ch_stk.top() != "(") && (!((ch_stk.top() == "+" || ch_stk.top() == "-") && (str[j] == '*' || str[j] == '/'))))
{
res[res_cur] = ch_stk.top();
res_cur++;
ch_stk.pop();
}
string str_temp(1, str[j]);
ch_stk.push(str_temp);
}
}
while(!ch_stk.empty())
{
if (ch_stk.top() == "(")
{
break;
}
else
{
res[res_cur] = ch_stk.top();
res_cur++;
ch_stk.pop();
}
}
stack <int> in_stk;
for(int j = 0; j < res_cur; ++j)
{
if(res[j][0] >= '0' && res[j][0] <= '9')
in_stk.push(atoi(res[j].c_str()));
else
{
int i_temp = 0;
if(res[j][0] == '+')
{
if (!in_stk.empty()) {i_temp = in_stk.top(); in_stk.pop();}
if (!in_stk.empty()) {i_temp += in_stk.top();in_stk.pop(); in_stk.push(i_temp);}
}
else if(res[j][0] == '-')
{
if (!in_stk.empty()) {i_temp = in_stk.top(); in_stk.pop();}
if (!in_stk.empty()) {i_temp = in_stk.top() - i_temp; in_stk.pop();in_stk.push(i_temp);}
}
else if(res[j][0] == '*')
{
if (!in_stk.empty()) {i_temp = in_stk.top(); in_stk.pop();}
if (!in_stk.empty()) {i_temp *= in_stk.top(); in_stk.pop();in_stk.push(i_temp);}
}
else if(res[j][0] == '/')
{
if (!in_stk.empty()) {i_temp = in_stk.top(); in_stk.pop();}
if (!in_stk.empty()) {i_temp = in_stk.top() / i_temp; in_stk.pop();in_stk.push(i_temp);}
}
}
}
cout << in_stk.top() << endl;
}
return 0;
}
转载于:https://my.oschina.net/locusxt/blog/163710