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

来源:互联网 发布:软件科技公司经营范围 编辑:程序博客网 时间:2024/05/08 23:09
 

优先级表如下:

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

进栈后        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");
}

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

原创粉丝点击