纪念逝去的计算器之计算表达式结果

小 V 发明了一个神奇的整数计算器:

给定一个合法的表达式,这个计算器能求出这个表达式的最终答案。

表达式可能包含:

+:运算符,整数加法。如 1+1=2

-:运算符,整数减法。如 1-1=0

:运算符,整数乘法。如 11=1

/:运算符,整数除法。如 3/2=1

(:左括号

):右括号

操作数:保证为非负整数,且操作数没有正号(如不会出现+1 等)
现在,给定一个表达式,小 V 在用这个计算器计算前想先知道最终答案是多少,你能 帮帮他吗?

★数据输入
一个合法的表达式,表达式长度不超过 1000。

★数据输出
表达式的最终结果。

★Notice
题目保证:输入的操作数,计算的中间值,计算的最终结果都在 int 范围内

★样例
输入示例 1+1 1+2/3 (1+2)*3
输出示例 2 1 9

 
            #include<iostream>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<stack>

using namespace std;

stack<int> Num_Stk;
stack<char>Oper_Stk;

int Oper_Big(char ch)
{
	
	if (Oper_Stk.empty() || ch == '(' || (Oper_Stk.top() == '('&&ch != ')'))
	{
		return 0;
	}
	else if ((Oper_Stk.top() == '+' || Oper_Stk.top() == '-') && (ch == '*' || ch == '/'))
	{
		return 0;
	}
	else if (Oper_Stk.top() == '('&&ch == ')')
	{
		Oper_Stk.pop(); return 1;
	}
	else return -1;
}

void Deal_num()
{
	int num1 = Num_Stk.top(); Num_Stk.pop();
	int num2 = Num_Stk.top(); Num_Stk.pop();
	int ans = 0;
	if (Oper_Stk.top() == '+')	ans = num1 + num2;
	else if (Oper_Stk.top() == '-')	ans = num2 - num1;
	else if (Oper_Stk.top() == '*')	ans = num1*num2;
	else if (Oper_Stk.top() == '/')ans = num2 / num1;
	Num_Stk.push(ans);
	Oper_Stk.pop();

}

int main()
{
	int num = 0;
	char str[1000] = "";
	cin >> str;
	int i = 0, j = 0, k = 0;
	while (str[i] != '\0')
	{
		char expre[1005]; j = 0;
		while (str[i] >= '0'&&str[i] <= '9')
		{
			expre[j] = str[i]; i++;
			j++; expre[j] = '\0';
		}
		if (str[i] != '(')
		{
			num = atoi(expre);
			Num_Stk.push(num);
		}
		while (1)
		{
			k = Oper_Big(str[i]);
			if (k == 0)
			{
				Oper_Stk.push(str[i]);
				break;
			}
			else if (k == 1)
			{
				i++;
			}
			else if (k == -1)
			{
				Deal_num();
			}
		}
		i++;
	}
	cout << Num_Stk.top() << endl;
	return 0;
}
        

之前老师布置的C++作业自己没有充分利用机会学习,这次算是后续弥补小部分,还有产生随机表达式的部分;

大致思路:一个数字处理函数,一个符号优先级处理函数,过程中用两个栈实现,一个int型存数字处理,一个char型存操作符处理;
在操作符优先级处理的时候考虑几种特殊的情况考虑很方便。

posted @ 2017-10-17 13:46  heihuifei  阅读(328)  评论(1编辑  收藏  举报