计算思路:
先将中缀表达式转换为后缀表达式,即逆波兰表达式,将原来输出的逆波兰表达式地方转化为调用计算逆波兰表达式的函数,如果是在数字后面则应该再传递给函数一个空格,最后栈顶元素即为最后的值。
具体代码如下:
#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
#include<set>
#include<map>
#include<queue>
#include<ctype.h>
#include<stack>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;
typedef unsigned long long ULL;
stack<double> cals; //计算逆波兰表达式
double a,b;
char str[100];
int i=0;
void cal(char c)
{
if(isdigit(c)||c=='.')
{
str[i++]=c;
str[i]='\0';
}
if(c==' ')
{
a=atof(str); //将字符串转化为浮点数
cals.push(a);
i=0;
}
switch(c)
{
case '+':
b=cals.top();
// cout<<b<<endl;
cals.pop();
a=cals.top();
// cout<<a<<endl;
cals.pop();
cals.push(a+b);
break;
case '-':
b=cals.top();
cals.pop();
a=cals.top();
cals.pop();
cals.push(a-b);
break;
case '*':
b=cals.top();
cals.pop();
a=cals.top();
cals.pop();
cals.push(a*b);
break;
case '/':
b=cals.top();
cals.pop();
a=cals.top();
cals.pop();
if(b!=0)
cals.push(a/b);
break;
}
return;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);//加快流输入输出
stack<char> s;
char space=' ';
char c,e;
char c2;
scanf("%c",&c);
while(c!='\n')
{
int flag=0;
while((isdigit(c)||c=='.'))
{
// cout<<c;
cal(c);
scanf("%c",&c);
if(c=='\n')
{
cal(space); //如果遇到换行,则说明最后一个肯定是个数字,所以传入空格进行计算。
flag=1;
break;
}
if(!isdigit(c)&&c!='.')
{
cal(space); //如果在数字后面的字符不是数字了,就传入空格进行计算。
}
// cout<<" ";
}
if(flag==1)
break;
if(c==')') //如果见了右括号就将括号里面的运算符出栈。
{
e=s.top();
s.pop();
while(e!='(')
{
// cout<<e<<" ";
cal(e); //将运算符传入进行计算。
// cal(space);
e=s.top();
s.pop();
}
}
else if(c=='+'||c=='-') //遇到加减号判断优先级。
{
if(s.empty())
s.push(c);
else
{
do
{
e=s.top();
s.pop();
if(e=='(')
s.push(e);
else
{
// cout<<e<<" ";
cal(e);
}
}while(!s.empty()&&e!='(');
s.push(c); //判断完后压入栈中。注意,这点容易遗忘
}
}
else if(c=='*'||c=='/'||c=='(')
s.push(c);
scanf("%c",&c);
}
while(!s.empty()) //如果栈非空,就还要进行计算。
{
e=s.top();
s.pop();
// cout<<e<<" ";
cal(e);
// cal(space);
}
a=cals.top();
cals.pop();
cout<<a<<endl;
return 0;
}