中缀表达式转换为后缀表达式

优先级表如下:

操作符 #    (      *,/        +,-       )

进栈后 0     1       5         3        6

进栈前 0     6       4         2       1

#include "stdio.h"
#include "malloc.h"
#define MAXSIZE 100    //初始分配单元为100

//------------------栈的定义 Stack.h------------------
typedef char DataType;
typedef struct node    //栈的表示
{
 DataType *base;     //栈底指针始终指向栈底的位置
        //在栈构造之前和销毁之后,base的值为NULL
 DataType *top;     //栈顶指针
 int stacksize;    //当前已分配的存储空间,以元素为单位
}SqStack;

void InitStack(SqStack *st)  //初始化栈
{
 st->base=(DataType*)malloc(MAXSIZE*sizeof(DataType));
 if(!st->base) return;  //存储分配失败
 st->top=st->base;     //设置栈为空
 st->stacksize=MAXSIZE;
}
int IsEmpty(SqStack *st){  //判断栈是否为空
 if(st->top==st->base)
  return 1;
 else
  return 0;
}

void GetStack(SqStack st,DataType *dataElem){ //获取栈顶元素
 if(st.top==st.base){
  printf("错误,栈空");
  return ;
 }
 *dataElem=*(st.top-1);     //获取栈顶的值返回给参数指针指向的值
}
void PopStack(SqStack *st){     //出栈
 if(st->top==st->base){
   printf("栈空不能出栈");
  return ;
 }
 st->top=--(st->top);     //删除栈顶元素
}
void PushStack(SqStack *st,DataType dataElem){ //进栈
 if(st->top-st->base>=st->stacksize){  //栈满不能进栈
   printf("栈空不能出栈");
  return ;
 }
 *st->top=dataElem;
 st->top++;
}
//--------------------------定义结束---------------------------------

//----------------中缀表示式转为后缀表达式--ZhanHuanHZ.h----------------------

int InPreStack(char c){          //进入栈前的优先级
 int i=0;
 switch (c)
 {
 case '#':            //#的优先级最低为0
  i=0;break;
 case '(':
  i=6;break;
 case '*':
 case '/':
  i=4;break;
 case '+':
 case '-':
  i=2;break;
 case ')':
  i=1;break;     
 default :            //否则为操作数,操作数的优先级最低,即
  i=-1;            //直接输出,不进栈
 }
 return i;
}
int InAfSatck(char c){          //进栈后的优先级
 int i=0;
 switch (c)
 {
 case '#':            //#的优先级最低为0
  i=0;break;
 case '(':            //优先级变为1
  i=1;break;
 case '*':            //进栈后的优先级加1
 case '/':
  i=5;break;
 case '+':
 case '-':
  i=3;break;
 case ')':            //优先级变为6
  i=6;break;     
 }         
 return i;
}

void Print_HouXu(char *ch){ 
 char char_out='#';           
 SqStack s; InitStack(&s);    
 PushStack(&s,'#');          //#进栈
 while(*ch!='#'){          //以输入#字符结束
  if(InPreStack(*ch)==-1){       //该字符为操作数,直接输出
   printf("%c",*ch);ch++;}
  else
  {
   GetStack(s,&char_out);       //获取栈顶的操作符
   while(InPreStack(*ch)<InAfSatck(char_out)){  //进栈前操作符的优先级小于进栈后的优先级
    printf("%c",char_out); PopStack(&s);
    GetStack(s,&char_out); }     //则出栈
   if(InPreStack(*ch)==InAfSatck(char_out)&&(char_out=='(')){  //如果相等就抵消(),不输出
    PopStack(&s);GetStack(s,&char_out);ch++;}
   if(InPreStack(*ch)>InAfSatck(char_out)){   //如果大于则进栈
    PushStack(&s,*ch); ch++;}
   
  }
 }
 if(!IsEmpty(&s)&&*ch=='#'){         //输入结束,栈不为空
  GetStack(s,&char_out);          
  while(!IsEmpty(&s)&&char_out!='#'){      //输出栈中的所有内容
  printf("%c",char_out); PopStack(&s);
  GetStack(s,&char_out);}
 }
}
//------------------------结束-------------------------------

///------------主函数测试--------------------------- 
void main()
{
 char ch[]={'a','+','b','*','(','c','-','d',')','-','e','/','f','#','\0'};
 printf("%s\n",ch);
 printf("输入的一个中缀表达式:\n");
 printf("如:a+b*(c-d)-e/f\n");
 printf("\n后缀表达式为:\t"); 
 Print_HouXu(ch);
 printf("\n正确答案为:\tabcd-*+ef/-\n"); 
}

//-------------测试结束-----------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值