中缀表达式的值

/*
中缀表达式 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值