中缀转后缀:
表达式求值:
代码:(输入#号结束)
#include <iostream>
#include <cstring>
#include <stack>
#include <queue>
#include <stdio.h>
using namespace std;
stack<string> fuhao;
stack<double> suansu;
queue<string> houzhui;
//判断两个符号的优先级
bool youji(string a,string b){
if(a=="+"||a=="-"){
if(b=="+"||b=="-"){
return true;
}else{
return false;
}
}
if(a=="*"||a=="/"){
if(b=="+"||b=="-"||b=="*"||b=="/"){
return true;
}
}
if(b=="("||a=="("){
return false;
}
}
//判断字符串是否是数字字符串
bool p_shuzi(string s){
bool b=true;
int s_len=s.size();
for(int i=0;i<s_len;i++){
if(s[i]>='0'&&s[i]<='9'){
continue;
}else{
b=false;
break;
}
}
return b;
}
//中缀转后缀
void zhuan_hou(){
string s[100]; //输入中缀表达式,用字符串处理,是为了可以输入多位以上的数字
//初始化s
for(int i=0;i<100;i++){
s[i]="|";
}
int j;
for(j=0;j<100;j++){ //输入#号退出
char temp1[100];
int i=0;
while(1){
cin>>temp1[i];
if(temp1[i]=='+'||temp1[i]=='-'||temp1[i]=='*'||temp1[i]=='/'||temp1[i]=='('||temp1[i]==')'||temp1[i]=='#'){
if(s[j]=="|"){//处理碰到*(的情况,连续两个符号的问题
s[j]=temp1[i];
}else{
s[++j]=temp1[i];
}
break;
}else{
if(s[j]=="|"){//处理碰到是数字的情况
s[j]="";
}
s[j]+=temp1[i++];
}
}
if(s[j]=="#"){
break;
}
}
int len=j+1;
// cout<<len;
//中缀表达式转后缀表达式
for(int i=0;i<len;i++){
//cout<<s[i];
if(s[i]=="#"){
//把符号栈中剩余的都进入
while(!fuhao.empty()){
houzhui.push(fuhao.top());
fuhao.pop();
}
break;
}
if(p_shuzi(s[i])){ //遇到数字进栈
houzhui.push(s[i]);
continue;
}
if((s[i]=="+"||s[i]=="-"||s[i]=="*"||s[i]=="/"||s[i]=="(")&&fuhao.empty()){ //遇到这些符号并且符号栈为空的时候进符号栈
fuhao.push(s[i]);
continue;
}
if(s[i]==")"){
while(fuhao.top()!="("){
houzhui.push(fuhao.top());
fuhao.pop();
}
fuhao.pop();
continue;
}
while(youji(fuhao.top(),s[i])){
houzhui.push(fuhao.top());
fuhao.pop();
if(fuhao.empty()){
break;
}
}
fuhao.push(s[i]);//符号入栈
}
// while(!houzhui.empty()){
// cout<<houzhui.front();
// houzhui.pop();
// }
}
void jisuan(){
//用后缀表达式求值
while(!houzhui.empty()){
string ch=houzhui.front();
//cout<<houzhui.size();
if(p_shuzi(ch)){
double num1;
int ch_len=ch.size();
char *ch1=new char[ch_len];
for(int i=0;i<ch_len;i++){
ch1[i]=ch[i];
}
//把数字字符串转为数字
sscanf(ch1,"%lf",&num1);
//cout<<num1<<"std"<<endl;
suansu.push(num1);
houzhui.pop();
}else{
houzhui.pop();
double num2=suansu.top();
suansu.pop();
double num1=suansu.top();
suansu.pop();
double jieguo;
//cout<<num1<<ch<<num2;
if(ch=="+"){
jieguo=num1+num2;
}else if(ch=="-"){
jieguo=num1-num2;
}else if(ch=="*"){
jieguo=num1*num2;
}else if(ch=="/"){
jieguo=num1/num2;
}
// cout<<jieguo<<endl;
suansu.push(jieguo);
}
}
cout<<suansu.top()<<endl;
}
int main(){
int m=3;
while(m--){
//每次计算完成之后,都需要将栈和队列清空
while(!fuhao.empty())fuhao.pop();
while(!suansu.empty())suansu.pop();
while(!houzhui.empty())houzhui.pop();
zhuan_hou(); //中缀转成后缀
jisuan(); //使用后缀进行计算
}
return 0;
}
测试结果:
测试后缀的时候,把我后缀函数中最后那几行注释打开,然后把主函数中的jisuan函数注释了,就可以测试后缀了