将中缀表达式转化成对应的后缀表达式
所谓后缀表达式是指这样的一个表达式:
式中不再引用括号,运算符号放在两个运算对象之后,所有计 算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级)
例1:中缀表达式: 3(5–2)+7 对应的后缀表达式为:352-7+
例2:中缀表达式: 2+48+(88+1)/3 对应的后缀表达式为 248+881+3/+
#include <iostream>
using namespace std;
#include <string>
struct Stack
{
string str;
int top;
};
void initstack(struct Stack &s);
string ztoh(string str);
void pushstack(struct Stack &s,char a);
char popstack(struct Stack &s);
char gettop(struct Stack &s);
int main()
{
string str;
cout<<"请输入中缀表达式:>";
while(cin>>str)
{
cout<<"对应的后缀表达式为:>"<<ztoh(str)<<endl;
cout<<"请输入中缀表达式:>";
}
return 0;
}
string ztoh(string str)
{
struct Stack s;
initstack(s);
string finalstr;
for(int i=0;str[i]!='\0';i++)
{
switch(str[i])
{
case '(': //直接入栈
pushstack(s,str[i]);
break;
case ')':
char topElem,n;
topElem=gettop(s); //取栈顶判断
while(topElem!='(')
{
n=popstack(s); //中间的出栈到后缀表达式
finalstr+=n;
if(s.top==-1)
{
break;
}
else
topElem=gettop(s);
}
popstack(s); //左括号出栈
break;
case '+':
case '-':
char topElem1,x1;
topElem1=gettop(s); //取栈顶判断
while(topElem1=='+'||topElem1=='-'||topElem1=='*'||topElem1=='/')
{
x1=popstack(s); //将符号(同级和高级)出栈到后缀表达式
finalstr+=x1;
if(s.top==-1)
break;
else
topElem1=gettop(s);
}
pushstack(s,str[i]); //将符号 +/- 入栈
break;
case '*':
case '/':
char topElem2,x2;
topElem2=gettop(s); //去栈顶判断
while(topElem2=='*'||topElem2=='/')
{
x2=popstack(s); //将符号出栈到后缀表达式
finalstr+=x2;
if(s.top==-1)
break;
else
topElem2=gettop(s);
}
pushstack(s,str[i]); //符号入栈
break;
default:
finalstr+=str[i]; //将符号外的字符加到后缀表达式
break;
}
}
while(s.top!=-1) //将栈中的符号加到后缀表达式上
{
char x3=popstack(s);
finalstr+=x3;
}
return finalstr;
}
void initstack(struct Stack &s) //栈初始化
{
s.top=-1;
return;
}
void pushstack(struct Stack &s,char a) //入栈
{
s.top++;
s.str[s.top]=a;
return;
}
char popstack(struct Stack &s) //出栈
{
if(s.top==-1)
return '#'; //随便搞了个字符
else
return s.str[s.top--];
}
char gettop(struct Stack &s) //读取栈顶元素
{
if(s.top==-1)
return '#'; //随便搞了个字符
else
return s.str[s.top];
}