用链栈将中缀表达式转换成逆波兰表达式
基本思想与我的用顺序栈实现将中缀表达式转换成后缀表达式相同,只是将入栈,出栈,判栈空等操作换成链栈的操作
整体代码:
#include<iostream>
typedef struct Stack1{
std::string stack;
struct Stack1* next;
}Stack1;
typedef struct Linkstack1{
struct Stack1* top;
}Linkstack1;
using namespace std;
int Isempty(Linkstack1*); //判栈空
int Push(Linkstack1*,string); //入栈
string Pop(Linkstack1*,string); //出栈
void Input(string&); //输入
int Compare(char); //比较操作符优先级
void Change(string&); //将中缀表达式转换成后缀表达式
int main(void){
string fix;
Input(fix);
Change(fix);
cout<<fix<<endl;
return 0;
}
int Isempty(Linkstack1*ptr){
return ptr->top==nullptr;
}
int Push(Linkstack1*ptr,string x){
Stack1*s=new Stack1;
s->stack=x;
s->next=ptr->top;
ptr->top=s;
return 1;
}
string Pop(Linkstack1*ptr){
if(Isempty(ptr)){
cout<<"The stack is empty."<<endl;
return 0;
}
Stack1* temp=ptr->top;
string x=temp->stack;
ptr->top=temp->next;
free(temp);
return x;
}
void Input(string&fix){
cout<<"请输入一个前缀表达式"<<endl;
getline(cin,fix);
}
int Compare(char op){ //判断操作符的优先级
int gra;
if(op=='+'||op=='-') gra=1;
else if(op=='*'||op=='/') gra=2;
else if(op=='('||op==')') gra=3;
else gra=0;
return gra;
}
void Change(string& fix){
string after;
Linkstack1 p;
p.top=nullptr;
int i,flag=0,rank1,rank2;
for(i=0;i<fix.size();i++){
if(isdigit(fix[i])||fix[i]=='.'){
after+=fix[i];
if(!isdigit(fix[i+1])&&fix[i+1]!='.')
after+=' ';
}else{
string temp;
temp=fix[i];
if(Isempty(&p)){
if(fix[i]=='(') flag++;
Push(&p,temp);
}else{
rank1=Compare(p.top->stack[0]);
rank2=Compare(fix[i]);
if(rank1<=rank2){
if(fix[i]!=')'){
if(fix[i]=='(')flag++;
Push(&p,temp);
}else{
if(flag==0){
cout<<"输入错误"<<endl;
return ;
}else{
while(p.top->stack[0]!='(') after+=Pop(&p);
Pop(&p);
flag--;
}
}
}else{
if(flag==0){
while(!Isempty(&p)) after+=Pop(&p);
Push(&p,temp);
}else{ //栈中有左括号
while(p.top->stack[0]!='(') after+=Pop(&p);
Push(&p,temp);
}
}
}
}
}
while(!Isempty(&p)) after+=Pop(&p);
fix=after;
}