您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验之栈二:一般算术表达式转换成后缀式

2016-07-02 10:01 411 查看


数据结构实验之栈二:一般算术表达式转换成后缀式




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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: