数据结构——中缀式转后缀式(C语言)

数据结构——中缀式转后缀式(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;
}
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值