#include <iostream>
#include <string>
#include <cstring>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <stack>
#include <sstream>
using namespace std;
int priority(char a, char b)
{
if(a == '+')
{
if(b == '+' || b == '-' || b == ')' || b == '#')
return 1;
else if(b == '*' || b == '/' || b == '(')
return -1;
}
else if(a == '-')
{
if(b == '+' || b == '-' || b == ')' || b == '#')
return 1;
else if(b == '*' || b == '/' || b == '(')
return -1;
}
else if(a == '*')
{
if(b == '+' || b == '-' || b == '*' || b == '/' || b==')' || b == '#')
return 1;
else
return -1;
}
else if(a == '/')
{
if(b == '+' || b == '-' || b == '*' || b == '/' || b==')' || b == '#')
return 1;
else
return -1;
}
else if(a == '(')
{
if(b == '+' || b == '-' || b == '*' || b == '/' || b == '(')
return -1;
else if(b == ')')
return 0;
}
else if(a == ')')
{
return 1;
}
else if(a == '#')
{
if(b == '+' || b == '-' || b == '*' || b == '/' || b=='(')
return -1;
else if(b == '#')
return 0;
}
}
double calculate(char op, double a, double b)
{
if(op == '+')
return a+b;
else if(op == '-')
return b - a;
else if(op == '*')
return a*b;
else if(op == '/')
return b/a;
}
double ToNum(string num)
{
int re = 0;
for(int i = 0; i < num.length(); ++i)
re = re*10 + (num[i] - '0');
return re;
}
int main()
{
string s;
while(cin >> s)
{
s+='#';
stack<char> op;//操作符
stack<double> operand;//操作數
string num;
// int tem;
op.push('#');
for(int i = 0; i < s.length(); ++i)
{
if(s[i] >= '0' && s[i] <= '9')
{
num = "";
while(s[i] >= '0' && s[i] <= '9')
{
num += s[i];
++i;
}
double t = ToNum(num);
// cout << num << endl;
operand.push(t);
--i;//注意回一位
}
else
{
if(priority(op.top(), s[i]) == -1)
op.push(s[i]);
else if(priority(op.top(), s[i]) == 0)
{
op.pop();
}
else if(priority(op.top(), s[i]) == 1)
{
char o = op.top();
op.pop();
double a = operand.top();
operand.pop();
double b = operand.top();
operand.pop();
double tem = calculate(o, a, b);
operand.push(tem);
--i;//回一位
}
}
}
cout << operand.top() << endl;;
}
return 0;
}
主要是棧的思想,注意細節。嚴蔚敏老師的《數據結構》有詳解。