纪念逝去的计算器之计算表达式结果
小 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型存操作符处理;
在操作符优先级处理的时候考虑几种特殊的情况考虑很方便。