数据结构——中缀式转后缀式(C语言)
功能实现流程:
1.遇到非运算符,直接输出;
2.栈为空时,遇到运算符,入栈;
3.遇到左括号,将其入栈;
4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;
5.遇到其他运算符’+’ ‘-’ ‘*’ '/'时,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈;
6.最终将栈中的元素依次出栈,输出。
//中缀式转后缀式 题解
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef struct //定义顺序栈
{
char *base;
char *top;
int stacksize;
}SqStack;
/*********栈函数********/
int InitStack(SqStack &S)//初始化
{
S.base=(char*)malloc(sizeof(char)*MAXSIZE);
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
int Push(SqStack &S,char e)//入栈
{
if(S.top-S.base==S.stacksize) return ERROR;//栈满
*S.top=e; //元素e压入栈顶,栈顶指针加1;
S.top++;
return OK;
}
int Pop(SqStack &S,char &e)//出栈
{
if(S.top==S.base) return ERROR; //栈空
--S.top;//栈顶指针减一,将栈顶元素赋给e;
e=*S.top;
return OK;
}
char GetTop(SqStack S)//取栈顶元素
{
if(S.top!=S.base)//栈非空
return *(S.top-1);//返回栈顶元素的值,栈顶指针不变
}
int In(char e)//判断读入字符是否为运算符
{
if(e=='+'||e=='-'||e=='*'||e=='/'||e=='('||e==')'||e=='#')
return 1;//是
else
return 0; //不是
}
char Compare(char a,char b)//比较运算符的优先级
{
char f;
if(a=='+'||a=='-')
{
if(b=='+'||b=='-')
f='>';
else if(b=='*'||b=='/')
f='<';
}
else if(a=='*'||a=='/')
{
if(b=='+'||b=='-'||b=='*'||b=='/')
f='>';
}
else if(a=='#')
{
if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(')
f='<';
else if(b=='#')
f='=';
}
return f;
}
int Eva(SqStack &S)
{
char ch,c;
ch=getchar();
while(1){
if(!In(ch)) //遇到非运算符,直接输出
printf("%c",ch);
else if(ch=='#'){ //输入#代表结束输入
while(S.top!=S.base){
Pop(S,c);
printf("%c",c);
}
}
else if(ch==')'){ //遇到)则出栈,直到弹出(,且(只出栈不输出
Pop(S,c);
while(c!='('){
printf("%c",c);
Pop(S,c);
}
}
else if(ch=='(') //如果遇到(则入栈
Push(S,ch);
else if(S.top==S.base) //遇到运算符,若栈空,则入栈
Push(S,ch);
else { //遇到其他运算符+-*/时,弹出所有优先级大于等于该运算符的栈顶元素,然后将该运算符入栈
char t=Compare(GetTop(S),ch);
while(t=='>'){
Pop(S,c);
printf("%c",c);
t=Compare(GetTop(S),ch);
}
Push(S,ch);
}
ch=getchar();
}
}
int main(){
SqStack S;
InitStack(S); //初始化运算符栈
Eva(S); //功能函数
return 0;
}