//四则运算
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int getLevel(char opr)
{
int lev;//运算符的优先级
if(opr == '+' || opr == '-')
lev = 1;
else if(opr == '*' || opr == '/')
lev = 2;
else if(opr == '(')
lev = 3;
else if(opr == ')')
lev = 3;
else
lev = -1;//非法符号
return lev;
}
double cal(double a,double b,char c)
{//此处不考虑除数为0的情况
double finvalue;//计算的最终结果
if(c == '+')
finvalue = a + b;
else if(c == '-')
finvalue = a - b;
else if(c == '*')
finvalue = a * b;
else if(c == '/')
finvalue = a / b;
return finvalue;
}
double calculator(const string& s)
{
double lnum,rnum;//出栈时计算的两个数
double value;//计算出栈时计算的两个数经过运算后的值
double num = 0; //式子中的数
int level;//运算符优先级
int Lastlevel = 0;//上一个运算符的优先级
string str = s;
stack<double> NumS;//存放数的栈
stack<char> OprS;//存放运算符的栈
for(int i = 0; i < s.length(); i++)
{
if(str[i] >= '0' && str[i] <= '9'){//读取数字
num = 10 * num + double (str[i] - '0');
}
else if(str[i] == ' ')
continue;
else
{
NumS.push(num);
num = 0;
level = getLevel(str[i]);
if(level <= Lastlevel)
{
if(NumS.size() < 2)
{
cout << "invaild" << endl;
break;
}
else
{
if(level == -1)
{
cout << "invalid" << endl;
break;
}
else if(str[i] != '+' || str[i] != '-' || str[i] != '*')
{
rnum = NumS.top();
NumS.pop();
lnum = NumS.top();
NumS.pop();
value = cal(lnum,rnum,str[i]);
NumS.push(value);
value = 0;
}
else if(str[i] != '/')
{
rnum = NumS.top();
NumS.pop();
lnum = NumS.top();
NumS.pop();
if(rnum != 0)
{
value = cal(lnum,rnum,str[i]);
NumS.push(value);
value = 0;
}
else
{
cout << "invaild" << endl;
break;
}
}
}
}
else
{
if(str[i] == ')')
{
char temp;//暂时储存栈顶元素
temp = OprS.top();
OprS.pop();
if(temp == '(')
{
cout << "invalid" << endl;
break;
}
else
{
while(OprS.top() != '(')
{
if(NumS.size() < 2)
{
cout << "invalid" << endl;
break;
}
else
{
if(temp != '/')
{
rnum = NumS.top();
NumS.pop();
lnum = NumS.top();
NumS.pop();
value = cal(lnum,rnum,OprS.top());
NumS.push(value);
value = 0;
OprS.pop();
}
else
{
if(rnum != 0)
{
rnum = NumS.top();
NumS.pop();
lnum = NumS.top();
NumS.pop();
value = cal(lnum,rnum,temp);
NumS.push(value);
value = 0;
OprS.pop();
}
else
{
cout << "invaild" << endl;
break;
}
}
}
}
if(OprS.empty())
{
cout << "invaild" << endl;
break;
}
else
{
OprS.pop();
Lastlevel = 0;
}
}
}
else
{
OprS.push(str[i]);
Lastlevel = getLevel(OprS.top());
if(Lastlevel == 3)
Lastlevel == 0;//(在运算符中的优先级降到最低
else
Lastlevel == Lastlevel;
}
}
}
if(i == str.length()-1 && num!=0)
NumS.push(num);
}
while(!OprS.empty())
{
if(NumS.size() < 2)
{
cout << "invalid" << endl;
break;
}
else
{
char temp_second;//暂时储存运算符栈顶元素
temp_second = OprS.top();
OprS.pop();
rnum = NumS.top();
NumS.pop();
lnum = NumS.top();
NumS.pop();
value = cal(lnum,rnum,temp_second);
NumS.push(value);
value == 0;
}
}
if(NumS.size() != 1)
{
cout << "invalid" << endl;
}
else
{
return NumS.top();
}
}
int main()
{
cout << calculator("(1+2)*3");
}
有可能是带括号解析不了。你对括号的左边和右边没有做对处理。
看一下下面的文章,仔细看一下是如何处理边界的。
字符串处理的地方应该有地方逻辑不对
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632