//此实现不考虑输入非法, 支持负数
#include<stack>
#include<iostream>
#include<string>
using namespace std;
int cal(string str)
{
int result = 0;
stack<int> stack_num;
stack<char> stack_c;
string suffix_exp="";
for(int i=0; str[i]; ++i)
{
int num = 0;
int flag = 0;
int cnt = 0;
while(str[i] == '+' || str[i] == '-')
{
if(str[i] == '-')
++cnt;
++i;
}
while(str[i]>='0' && str[i]<='9')
{
num = num*10 + (str[i] - '0');
flag = 1;
suffix_exp += str[i];
++i;
}
if(flag == 1)
{
if(cnt & 1 == 1)
num = 0 - num;
stack_num.push(num);
suffix_exp += " ";
}
if(str[i] == '\0')
{
break;
}
if(stack_c.empty() || stack_c.top() == '(' || str[i] == '(')
{
stack_c.push(str[i]);
continue ;
}
if(str[i] == '+' || str[i] == '-')
{
while(!stack_c.empty() && stack_c.top()!='(')
{
int num1 = stack_num.top();
stack_num.pop();
int num2 = stack_num.top();
stack_num.pop();
char c = stack_c.top();
stack_c.pop();
int tmp = 0;
switch(c)
{
case '+':tmp = num1 + num2;break;
case '-':tmp = num2 - num1;break;
case '*':tmp = num1 * num2;break;
case '/':tmp = num2 / num1;break;
}
stack_num.push(tmp);
suffix_exp = suffix_exp + c + " ";
}
stack_c.push(str[i]);
continue ;
}
if(str[i] == '*' || str[i] == '/')
{
while(!stack_c.empty() && (stack_c.top() == '*' || stack_c.top() == '/'))
{
int num1 = stack_num.top();
stack_num.pop();
int num2 = stack_num.top();
stack_num.pop();
char c = stack_c.top();
stack_c.pop();
int tmp = 0;
switch(c)
{
case '*':tmp = num1 * num2;break;
case '/':tmp = num2 / num1;break;
}
stack_num.push(tmp);
suffix_exp = suffix_exp + c + " ";
}
stack_c.push(str[i]);
continue ;
}
if(str[i] == ')')
{
while(!stack_c.empty() && stack_c.top()!='(')
{
int num1 = stack_num.top();
stack_num.pop();
int num2 = stack_num.top();
stack_num.pop();
char c = stack_c.top();
stack_c.pop();
int tmp = 0;
switch(c)
{
case '+':tmp = num1 + num2;break;
case '-':tmp = num2 - num1;break;
case '*':tmp = num1 * num2;break;
case '/':tmp = num2 / num1;break;
}
stack_num.push(tmp);
suffix_exp = suffix_exp + c + " ";
}
if(!stack_c.empty() && stack_c.top()=='(')
{
stack_c.pop();
}
}
}
while(!stack_c.empty())
{
int num1 = stack_num.top();
stack_num.pop();
int num2 = stack_num.top();
stack_num.pop();
char c = stack_c.top();
stack_c.pop();
int tmp = 0;
switch(c)
{
case '+':tmp = num1 + num2;break;
case '-':tmp = num2 - num1;break;
case '*':tmp = num1 * num2;break;
case '/':tmp = num2 / num1;break;
}
stack_num.push(tmp);
suffix_exp = suffix_exp + c + " ";
}
cout << suffix_exp<<endl;
return stack_num.top();
}
int main()
{
string str="5-3+9*6*(6-10-2)";
// while(cin>>str)
{
cout<<cal(str)<<endl;
}
return 0;
}
四则运算(后缀表达式实现)
最新推荐文章于 2024-05-11 17:01:37 发布