Jobdu_oj(九度) --表达式求值(简易计算器)
Description
对于一个不存在括号的表达式进行计算
Input
存在多种数据,每组数据一行,表达式不存在空格
Output
输出结果
Sample Input
6/2+3+3*4
Sample Output
18
Source Code
#include <iostream>
#include <stack>
using namespace std;
stack <int> num;
stack <char> op;
int priority(char s){
switch (s){
case '+': return 2;
case '-': return 2;
case '*': return 3;
case '/': return 3;
case '@': return 1;
default: return 0;
}
}
int calcualte(stack<int> &num,stack<char> &op){
int num1=num.top();
num.pop();
int num2=num.top();
num.pop();
char OP=op.top();
op.pop();
int result;
switch (OP){
case '+': result= num1+num2; num.push(result); return result;
case '-': result= num2-num1; num.push(result); return result;
case '*': result= num1*num2; num.push(result); return result;
case '/': result= num2/num1; num.push(result); return result;
}
}
int main() {
string str;
string str_num;
while(cin>>str){
str+='@';
for(int i=0;i<str.length();){
if(priority(str[i])==0){ //如果是数字
str_num+=str[i];
i++;
}
else{
if(!str_num.empty()) {
num.push(atoi(str_num.c_str()));
}
str_num="";
if( str[i]=='@' || op.empty() || priority(str[i]) > priority(op.top())){
op.push(str[i]);
i++;
}
else{
calcualte(num,op);
}
}
}
op.pop();
while(!op.empty()){
calcualte(num,op);
}
cout<<num.top()<<endl;
}
return 0;
}
Test case
2+1
3
2+3*3
11
2+3*4*2
26
2*4*1-2*1*2
4