您的位置:首页 > 其它

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

2012-04-07 14:19 381 查看
优先级表如下:

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

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

}

//-------------测试结束-----------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: