数据结构实验之栈与队列二:一般算术表达式转换成后缀式
Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample
Input
a*b+(c-d/e)*f#
Output
abcde/-f+
#include<bits/stdc++.h>
using namespace std;
const int MAXSIZE=200000;
typedef struct node
{
int top;
int len;
char*data;
} Stack;
void push(Stack &sta,char x)
{
if(sta.top==sta.len)
{
sta.data=(char*)realloc(sta.data,sizeof(char)*(sta.len+MAXSIZE));
sta.len=sta.len+MAXSIZE;
}
else
{
sta.data[sta.top]=x;
sta.top++;
}
}
void pop(Stack &sta,char&x)
{
if(sta.top!=0)
{
sta.top--;
x=sta.data[sta.top];
}
}
bool isempty(Stack&sta)
{
if(sta.top==0)
return false;
else
return true;
}//以上都是对数组的相关操作。
int main()
{
char ch;
Stack sta;
sta.data=(char*)malloc(sizeof(char)*MAXSIZE);//创建一个栈
sta.len=MAXSIZE;
sta.top=0;//初始栈为空
char x;//x用于保存出栈的数据
while(scanf("%c",&ch))
{
if(ch!='#')
{
if(ch=='(')
{
push(sta,ch);
}
else if(ch==')')
{
while(sta.data[sta.top-1]!='(')
{
pop(sta,x);
cout<<x;
}
pop(sta,x);
}
else if(ch=='+'||ch=='-')//在/、*、+、-四种运算符中+、-优先级是最低的,因此只要栈没空,或者遇到(之前都将栈中已保存的运算符输出。
{
while(isempty(sta)&&sta.data[sta.top-1]!='(')
{
pop(sta,x);
cout<<x;
}
push(sta,ch);//然后将+或者-入栈。
}
else if(ch=='*')
{
while(isempty(sta)&&(sta.data[sta.top-1]=='*'||sta.data[sta.top-1]=='/'))
{
pop(sta,x);
cout<<x;
}
push(sta,ch);
}
else if(ch=='/')
{
while(sta.data[sta.top-1]=='*'||sta.data[sta.top-1]=='/')
{
pop(sta,x);
cout<<x;
}
push(sta,ch);
}
else
cout<<ch;
}
else
break;
}
while(isempty(sta))//栈未空时将栈中保存的所有运算符出栈。
{
pop(sta,x);
cout<<x;
}
return 0;
}