时隔一年多,我又重新写了一遍中缀表达式和后缀表达式,之前的2篇文章是2017年10月31号的,中缀表达式转后缀表达式,后缀表达式时间过的真快啊,要继续努力,不负好时光。
之前思路是对的,但我是一个一个字符char处理,只能处理1位数的加减乘除啊,显然不行,还要处理小数。因为我在学习Qt,写了一个正常功能的计算器Qt5 计算器的实现,所以重新写了。
#include<bits/stdc++.h>
using namespace std;
int instack(string c)//堆栈内部的运算符优先级
{
int priority;
if(c=="(")
priority=0;
if(c=="+"||c=="-")
priority=1;
if(c=="*"||c=="/")
priority=2;
if(c=="#")
priority=0;
return priority;
}
int outstack(string c)//堆栈外的运算符优先级
{
int priority;
if(c=="(")
priority=3;
if(c=="+"||c=="-")
priority=1;
if(c=="*"||c=="/")
priority=2;
return priority;
}
vector<string> InfixToPostfix(string str)
{
vector<string> exp,res;
string tstr="";
for(int i=0;i<str.length();i++)
{
//cout<<i<<endl;
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='('||str[i]==')')
{
if(tstr.length()!=0)
{
exp.push_back(tstr);
tstr="";
}
tstr+=str[i];
exp.push_back(tstr);
tstr="";
}
else
{
tstr+=str[i];
}
}
if(tstr.length()!=0)
exp.push_back(tstr);
exp.push_back("#");
stack<string> stk;//存放 运算符和括号的栈
stk.push("#");
//string test="#";
string st="";
//cout<<exp.size()<<endl;
//int i=0;
for(int i=0;i<exp.size()-1;i++)//for(i=0,st=exp[i];exp[i]!="#";i++,st=exp[i])
{
st=exp[i];
if(st==")")
{
while(stk.top()!="(")
{
res.push_back(stk.top());
stk.pop();
}
stk.pop();
}
else if(st=="+"||st=="-"||st=="*"||st=="/"||st=="("||st=="#")
{
while(instack(stk.top())>=outstack(st))
{
res.push_back(stk.top());
stk.pop();
}
stk.push(st);
}
else
{
res.push_back(st);
}
}
while(!stk.empty())
{
if(stk.top()!="#")
{
res.push_back(stk.top());
}
stk.pop();
}
return res;
}
bool operation(string tmp,stack<double> &stk)
{
double a=0,b=0;//操作数
if(stk.size()<2)
{
cout<<"miss operator number"<<endl;
}
else
{
a=stk.top();
stk.pop();
b=stk.top();
stk.pop();
if(tmp=="+")
{
stk.push(b+a);
}
else if(tmp=="-")
{
stk.push(b-a);
}
else if(tmp=="*")
{
stk.push(b*a);
}
else if(tmp=="/")
{
if(a==0)
{
cout<<"denominator is 0!!!"<<endl;
return false;
}
else
{
stk.push(b/a);
}
}
}
return true;
}
double postfix2ans(vector<string> exp)
{
string tmp;//临时存放后缀表达式的每一项
bool flag=true;
stack<double> stk;
for(int i=0;i<exp.size();i++)
{
tmp=exp[i];
if(tmp=="+"||tmp=="-"||tmp=="*"||tmp=="/")
{
flag=operation(tmp,stk);
if(!flag)
return 0;
}
else
{
stk.push(atof(tmp.c_str()));//c_str是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。
}
}
return stk.top();
}
int main()
{
string str="1.3";
cin>>str;
vector<string> res;
res=InfixToPostfix(str);
for(int i=0;i<res.size();i++)
cout<<res[i];
cout<<endl;
cout<<postfix2ans(res);
return 0;
}
程序运行结果: