数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
提示
#include<iostream>
#include<cstdlib>
#include<string>
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
using namespace std;
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;
SqStack S;
int InitStack(SqStack &S)//构造一个空栈
{
S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char ));
if(!S.base)
exit(0);
S.top=S.base;
S.stacksize = STACK_INIT_SIZE;
return 1;
}
char GetTop(SqStack S,char &e)//获取栈顶元素
{
if(S.top==S.base)
return 0;
e=*(S.top-1);
return 1;
}
int Push(SqStack &S,char e)压栈,插入元素e为新的栈顶元素
{
if(S.top-S.base>=S.stacksize)//栈满,追加存储空间
{
S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char ));
if(!S.base)
exit(0);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int Pop(SqStack &S,char &e)//出栈
{
if(S.top==S.base)
return 0;
e=*(S.top--);
return 1;
}
int StackEmpty(SqStack S)//判空
{
if(S.top==S.base)
return true;
else
return false;
}
int youxian(char c)//符号优先级判断
{
if(c=='+'||c=='-')
return 1;
if(c=='*'||c=='/')
return 2;
if(c=='(')
return 3;
if(c==')')
return 4;
}
int main()
{
char etop,epop;
string str;
cin>>str;
int i=0;
while(str[i]!='#')
{
if(str[i]>='a'&&str[i]<='z'){
cout<<str[i]; //如果不是符号直接输出
}
else
{
if(StackEmpty(S))
Push(S,str[i]);//如果栈为空,符号直接进栈
else//否则判断要进入的元素和栈顶元素的优先级
{
GetTop(S,etop);
if(youxian(str[i])>=youxian(etop))//如果优先级高于栈顶元素
{
if(youxian(str[i])==4)//如果为‘)’,则将‘(’右边的元素出栈
{
GetTop(S,etop);
while(etop!='(')
{
cout<<etop;
Pop(S,epop);
GetTop(S,etop);
}
Pop(S,epop);//删除‘(’
}
else//若不是‘)’,则进栈
{
Push(S,str[i]);
}
}
else//如果优先级低于栈顶元素
{
if(etop!='(')//判断栈顶元素是否为‘(’,如果不是栈顶元素出栈,当前元素进栈
{
Pop(S,epop);
cout<<etop;
Push(S,str[i]);
}
else//是‘(’进栈
{
Push(S,str[i]);
}
}
}
}
i++;
}
GetTop(S,etop);
while(!StackEmpty(S))//将栈中元素出栈
{
cout<<etop;
Pop(S,epop);
GetTop(S,etop);
}
cout<<endl;
return 0;
}