描述
给定一个字符串描述的算术表达式,计算出结果值。
输入字符串长度不超过 100 ,合法的字符包括 ”+, -, *, /, (, )” , ”0-9” 。
数据范围:运算过程中和最终结果均满足∣val∣≤2^31−1 ,即只进行整型运算,确保输入的表达式合法
输入描述:
输入算术表达式
输出描述:
计算出结果值
示例1
输入:
400+5
输出:
405
#include<cstdio>
#include<string>
#include<map>
#include<stack>
using namespace std;
map<char,int> myMap={
{'$',0},
{'+',1},{'-',1},
{'*',2},{'/',2}
};
stack<int> numStack;
stack<char> opStack;
int cal(char op,int left,int right)
{
int res;
switch (op) {
case '+':res=left+right;break;
case '-':res=left-right;break;
case '*':res=left*right;break;
case '/':res=left/right;break;
}
return res;
}
int main()
{
// 1.读取数据
char buf[200];
fgets(buf,200,stdin);
string str0=buf;
str0.pop_back();
str0.push_back('$');
string str="";
// 2.预处理,对于表示正负号的‘+’和‘-’,在其前面添加数字0
for(int i=0;i<str0.size();i++)
{
//正负号可能出现的位置
//1)第一个字符
if(i==0 && (str0[i]=='+' || str0[i]=='-'))
{
str.push_back('0');
}
//2)紧跟左括号之后
else
{
if(str0[i]=='(' && (str0[i+1]=='+' || str0[i+1]=='-'))
{
str.push_back('0');
}
}
str.push_back(str0[i]);
}
// 3.计算
string num="";
for(int i=0;i<str.size();i++)
{
// 3.1 遇到数字
if(str[i]>='0' && str[i]<='9')
{
num.push_back(str[i]);
}
// 3.2 非数字
else {
// 收集数据入栈
if(num!="")
{
numStack.push(stoi(num));
num="";
}
// 1)遇到左括号,入栈
if(str[i]=='(')
{
opStack.push(str[i]);
}
// 2)遇到右括号,计算,左括号出栈
else if(str[i]==')')
{
while (opStack.top()!='(' ) {
// 数据栈取两个操作数
int right=numStack.top();
numStack.pop();
int left=numStack.top();
numStack.pop();
// 符号栈取一个运算符
char op=opStack.top();
opStack.pop();
// 计算,结果入栈
int res=cal(op,left,right);
numStack.push(res);
}
// 左括号出栈
opStack.pop();
}
// 3)遇到运算符,计算
else {
while(opStack.empty()==false && myMap[str[i]] <= myMap[opStack.top()])
{
// 数据栈取两个操作数
int right=numStack.top();
numStack.pop();
int left=numStack.top();
numStack.pop();
// 符号栈取一个运算符
char op=opStack.top();
opStack.pop();
// 计算,结果入栈
int res=cal(op,left,right);
numStack.push(res);
}
// 当前运算符入栈
opStack.push(str[i]);
}
}
}
// 4.输出结果
printf("%d",numStack.top());
}