规则:
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
stack<int>Num;
stack<char>Op;
const int max_size = 1024;
/*将字符串转为int*/
int str2num(char **str)
{
int temp = 0;
while(**str >= '0' && **str <= '9')
{
temp = temp * 10 + (**str - '0');
(*str)++;
}
return temp;
}
int cal(int a,int b,char op)
{
switch(op)
{
case '+':return a + b;break;
case '-':return a - b;break;
case '*':return a * b;break;
case '/':return a / b;break;
default:break;
}
}
void handlebuffer(char *str)
{
if(str == NULL)
{
return;
}
int num;
int a;
int b;
char op;
char *temp = str;
while(*temp != '\0')
{
if(*temp >= '0' && *temp <= '9')
{
num = str2num(&temp);
Num.push(num);
}
switch(*temp)
{
case '(':
{
Op.push(*temp);
break;
}
case ')':
{
b = Num.top();
Num.pop();
a = Num.top();
Num.pop();
op = Op.top();
Op.pop();
num = cal(a,b,op);
Num.push(num);
Op.pop(); //将'('出栈
break;
}
case '+':
{
if(Op.empty() != true) //当stack为空时,stack.top()使用时,方法会出错
{
if(Op.top() == '+' || Op.top() == '-' || Op.top() == '*' || Op.top() == '/')
{
b = Num.top();
Num.pop();
a = Num.top();
Num.pop();
num = cal(a,b,*temp);
Num.push(num);
break;
}
}
Op.push(*temp);
break;
}
case '-':
{
if(Op.empty() != true)
{
if(Op.top() == '+' || Op.top() == '-' || Op.top() == '*' || Op.top() == '/')
{
b = Num.top();
Num.pop();
a = Num.top();
Num.pop();
num = cal(a,b,*temp);
Num.push(num);
break;
}
}
Op.push(*temp);
break;
}
case '*':
{
if(Op.empty() != true)
{
if(Op.top() == '*' || Op.top() == '/')
{
b = Num.top();
Num.pop();
a = Num.top();
Num.pop();
num = cal(a,b,*temp);
Num.push(num);
break;
}
}
Op.push(*temp);
break;
}
case '/':
{
if(Op.empty() != true)
{
if(Op.top() == '*' || Op.top() == '/')
{
b = Num.top();
Num.pop();
a = Num.top();
Num.pop();
num = cal(a,b,*temp);
Num.push(num);
break;
}
}
Op.push(*temp);
break;
}
}
temp++;
}
while(Op.empty() != true)
{
b = Num.top();
Num.pop();
a = Num.top();
Num.pop();
op = Op.top();
Op.pop();
num = cal(a,b,op);
Num.push(num);
}
num = Num.top();
Num.pop();
cout << "result = " << num << endl;
}
int main()
{
char buffer[max_size];
cout << "Please input 1 + 2 + 3 *(4 + 5)" << endl;
cin.getline(buffer,max_size);
handlebuffer(buffer);
return 0;
}