#include <iostream>
#include <string>
#include <stack>
using namespace std;
int pdyxj(char c) //判断符号优先级
{
int t;
switch (c)
{
case '+':t = 1; break;
case '-':t = 1; break;
case '*':t = 2; break;
case '/':t = 2; break;
default:t = -1; break;
}
return t;
}
string zzh(string zfs) //中缀表达式转后缀表达式
{
string ts;
stack<char> zhan;
zhan.push('0');
int len = zfs.length();
for (int i = 0; i < len; i++)
{
if (zfs[i] >= '0' && zfs[i] <= '9' || zfs[i]=='.')
{
ts.push_back(zfs[i]);
}
else
{
if (zfs[i] != '(')
ts.push_back('|');
if (zfs[i] != '(' && pdyxj(zfs[i]) <= pdyxj(zhan.top()) || zfs[i] == ')')
{
while (zhan.top()!='0' && zhan.top() != '(')
{
//cout << zhan.top() << "\n";
if (zhan.top() != '(' && zhan.top() != ')')
{
ts.push_back(zhan.top());
}
zhan.pop();
}
if (zhan.top() == '(')
zhan.pop();
if (zfs[i] != ')')
zhan.push(zfs[i]);
}
else
{
zhan.push(zfs[i]);
}
}
}
ts.push_back('|');
while (zhan.top() != '0')
{
ts.push_back(zhan.top());
zhan.pop();
}
return ts;
}
double zfzsz(string zfs) //string类型转成double类型
{
double jg=0;
double t=10;
for (int i = 0; i < zfs[i]; i++)
{
if (zfs[i] == '.')
{
t = 0.1;
continue;
}
jg += ((int)zfs[i] - 48);
jg *= t;
}
//cout << jg << "\n";
return jg/10;
}
double add(stack<double>* zhan) //加
{
double a1, a2;
a1 = zhan->top();
zhan->pop();
a2 = zhan->top();
zhan->pop();
return a2 + a1;
}
double sub(stack<double>* zhan) //减
{
double a1, a2;
a1 = zhan->top();
zhan->pop();
a2 = zhan->top();
zhan->pop();
return a2 - a1;
}
double mul(stack<double>* zhan) //乘
{
double a1, a2;
a1 = zhan->top();
zhan->pop();
a2 = zhan->top();
zhan->pop();
return a2 * a1;
}
double div(stack<double>* zhan) //除
{
double a1, a2;
a1 = zhan->top();
zhan->pop();
a2 = zhan->top();
zhan->pop();
return a2 / a1;
}
double jisuan(string zfs) //计算
{
double jg=0; //用来存储结果
stack<double> zhan;
string ts;
for (int i = 0; i < zfs[i]; i++)
{
if (zfs[i] >= '0' && zfs[i] <= '9' || zfs[i] == '.')
{
ts.push_back(zfs[i]);
}
else
{
if (zfs[i] == ' ')
{
if (ts.empty())
continue;
zhan.push(zfzsz(ts));
ts.assign("");
//cout << zhan.top();
}
else
{
switch (zfs[i])
{
case'+':zhan.push(add(&zhan)); break;
case'-':zhan.push(sub(&zhan)); break;
case'*':zhan.push(mul(&zhan)); break;
case'/':zhan.push(div(&zhan)); break;
}
}
}
}
jg = zhan.top();
return jg;
}
string zlzfs(string zfs) //将字符串转换成适合计算的格式
{
string ts;
for (int i = 0; i < zfs[i]; i++)
{
if (zfs[i] >= '0' && zfs[i] <= '9' || zfs[i] == '.')
{
ts.push_back(zfs[i]);
}
else
{
ts.push_back(' ');
if (zfs[i] != '|')
{
ts.push_back(zfs[i]);
ts.push_back(' ');
}
}
}
for (int i = 0; i < ts[i]; i++)
{
if (ts[i] == ' ' && ts[i+1]==' ')
{
ts.erase(i,1);
i--;
}
}
return ts;
}
int main()
{
string zfs;
cin >> zfs;
zfs.assign(zzh(zfs));
zfs.assign(zlzfs(zfs));
cout << jisuan(zfs);
return 0;
}
C++基于后缀(逆波兰)表达式实现的简单计算器
最新推荐文章于 2023-11-24 17:36:38 发布