中缀转后缀

来源:互联网 发布:集邮网厅抢票软件 编辑:程序博客网 时间:2024/05/16 11:25
#include <iostream>
using namespace std;
#define MAX 30
struct Stack
{
char str[MAX];
int top;
};


void InitStack(Stack &s)
{
s.top=-1;
}
char Pop(Stack &s)
{
if(s.top==-1)
return 'E';
else
return s.str[s.top--];
}
void Push(Stack &s,char c)
{
if(s.top==MAX-1)
cout<<"full stack"<<endl;
else
s.str[++s.top]=c;
}
char Top(Stack &s)
{
if(s.top==-1)
return -1;
else
return s.str[s.top];
}


int Copare(char a,char b)
{
int m=0,n=0;
if((a=='*' || a=='/')  )
m=1;
else if((a=='+' || a=='-')  )
m=0;
else if(a=='('  )//'(’优先级倒数第二高,为了接收'('后的+-*/
m=-1;




if((b=='*' || b=='/')  )
n=1;
else if((b=='+' || b=='-')  )
n=0;
else if(b=='('  )
n=-1;




if(a==-1)
m=-2;
if(b==-1)
n=-2;
return m-n;//若m-n>0则a优先,=0则相同,<0则b优先

}
void main()
{
Stack s1;
InitStack(s1);
char str[]="(1+(4-5)*8)/2";
int n=strlen(str),k=0;
char str2[MAX]="";


for(int i=0;i<n;i++)
{
if(str[i]>='0' && str[i]<='9')
{
str2[k++]=str[i];//数字直接放到新字符串中
}
else if(str[i]=='+' || str[i]=='-' || str[i]=='*' || str[i]=='/'|| str[i]=='('|| str[i]==')')
{
    
if((str[i]=='('||  Copare(Top(s1),str[i])<0 ) )//str[i]优先级高,'('比较特殊:(必须入栈,
//且(后的+-*/都能入栈
{
Push(s1,str[i]);
}
else//出栈,直至s中的比str[i]优先级低,然后再把str[i]压入栈中
{
if(str[i]==')')    //')'不入栈
{

while(Top(s1)!='(')//一直出栈,直到'('
{
str2[k++]=Top(s1);
Pop(s1);
}
Pop(s1);//'('不放入新字符串中
}
else//没有括号的情况
{
while( Copare(Top(s1),str[i])>=0 )
{
str2[k++]=Top(s1);
Pop(s1);
}
Push(s1,str[i]);
}

}
}


}
//读完字符串后把栈中剩下来的全部复制到新字符串中
while(s1.top!=-1)
{
str2[k++]=Top(s1);
Pop(s1);
}


cout<<str2<<endl;





}
0 0