代码来自https://www.cnblogs.com/demian/p/6104625.html
可以实现+ - * / ( ) . 等运算符,表达式以字符串的形式计算,字符串中不允许有空格
//欧拉函数打表
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<stack>
#pragma warning(disable:4996)
#define me(s) memset(s,0,sizeof(s))
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
double toNum(char*s, int &k)
{
int flag = 0;
double x = 0.0, y = 0.1;
while (s[k] >= '0'&&s[k] <= '9' || s[k] == '.')
{
if (s[k] >= '0'&&s[k] <= '9')
{
if (flag == 0)
x = x * 10 + s[k] - '0';
else
{
x = x + y * (s[k] - '0');
y = y * 0.1;
}
}
else
{
flag = 1;
}
k = k + 1;
}
return x;
}
int priority(char c)
{
int k;
switch (c)
{
case '*':k = 2; break;
case '/':k = 2; break;
case '+':k = 1; break;
case '-':k = 1; break;
case '(':k = 0; break;
case ')':k = 0; break;
default:k = -1; break;
}
return k;
}
void cal(char *s)
{
stack<double> sv;
stack<char> sp;
char c;
int k = 0, flag = 1;
double x, y;
sp.push('\0');
c = s[k];
while (flag)
{
if (c >= '0'&&c <= '9' || c == '.')
{
sv.push(toNum(s, k));
}
else if (c == '\0'&& sp.top() == '\0')
{
flag = 0;
}
else if (c == '(' || (priority(c) > priority(sp.top())))
{
sp.push(c);
k++;
}
else if (c == ')'&& sp.top() == '(')
{
sp.pop();
k++;
}
else if (priority(c) <= priority(sp.top()))
{
x = sv.top();
sv.pop();
y = sv.top();
sv.pop();
c = sp.top();
sp.pop();
switch (c)
{
case '+':y = x + y; break;
case '-':y = y - x; break;
case '*':y = x * y; break;
case '/':y = y / x; break;
}
sv.push(y);
}
c = s[k];
}
cout << sv.top() << endl;
}
int main()
{
char s[100 + 10];
while (scanf("%s", s) == 1)
{
cal(s);
}
system("pause");
return 0;
}