您的位置:首页 > 其它

C用栈实现中缀表达式转后缀表达式

2010-12-11 14:57 267 查看
#include <Stdio.h>

#include <Conio.h>

#include <Stdlib.h>

#define Maxsize 100 /*设顺序表的最大长度为100,可依具体情况分配空间*/



typedef char datatype;



typedef struct



{



datatype data[Maxsize];



int top;/*栈顶指针*/



}SeqStack;/* 顺序栈类型定义 */





/* 构造一个空栈 */



SeqStack *InitStack()



{



SeqStack *s;/* s为顺序栈类型变量的指针*/



s=(SeqStack *)malloc(sizeof(SeqStack));



if(!s)



{



printf("空间不足/n");



return NULL;



}



else



{



s->top=-1;



return s;



}



}



/* 取栈顶元素 */



datatype GetTop(SeqStack *s)



{



if(s->top == -1)



{



printf("/n栈是空的!");



return 0;



}



else



return s->data[s->top];



}



/* 入栈 */



SeqStack *Push(SeqStack *s,datatype x)



{



if(s->top == Maxsize-1 )



{



printf("/n栈是满的!");



return NULL;



}



else



{



s->top++;



s->data[s->top]=x;



return s;



}



}



/* 出栈 */



datatype Pop(SeqStack *s)



{



if(s->top == -1)



{



//printf("/n栈已经空了!");



return 0;



}



s->top--;



return s->data[s->top+1];



}



/* 判别空栈 */



datatype SeqStackEmpty(SeqStack *s)



{



if(s->top ==-1)



{



// printf("此栈是空栈!");



return 1;



}



else



{



// printf("此栈不是空栈!");



return 0;



}



}



void display(SeqStack *p)



{



int t ;



t = p->top;



if(p->top==-1)



{



printf("/n此栈是空的");



}



else



while(t!=-1)



{



printf("%d->",p->data[t]);



t--;



}



}



/* 检测括号是否配对 */

int CheckBracket(char *str)

{

int i=0;

SeqStack *p= InitStack();



datatype ch;



while(str[i])

{

ch=str[i];



if(ch=='(')

{

Push(p,ch); //遇到左括号入栈



}

else

if(ch==')')

{

if(Pop(p)==0) //遇到右括号出栈,如果栈为空,则表达式缺左括号

{

return 0;

}



}

i++;

}



return SeqStackEmpty(p); //栈空则表示配对,栈不为空则表示缺右括号

}





/* 判断优先级 */

char proceed(char left,char right)

{

/* 设定优先矩阵 */

char PriorityMatrix[][8]={

{'0','+','-','*','/','(',')','#'},

{'+','>','>','<','<','<','>','>'},

{'-','>','>','<','<','<','>','>'},

{'*','>','>','>','>','<','>','>'},

{'/','>','>','>','>','<','>','>'},

{'(','<','>','<','<','<','=',' '},

{')','>','<','>','>',' ','>','>'},

{'#','<','<','<','<','<',' ','='}

};

int i,j;

for(i=0;i<8;i++)

if(PriorityMatrix[i][0]==left) break;



for(j=0;j<8;j++)

if(PriorityMatrix[0][j]==right) break;



return PriorityMatrix[i][j];

}



int isNum(char str)

{

char oper[]={'0','1','2','3','4','5','6','7','8','9'};

int temp,i;

for(i=0;i<10;i++)

{ if(oper[i]==str)

return 1;

}

return 0;

}



void post(char r[])

{

char temp,str;

int j=0;

SeqStack *s;

s=InitStack();



Push(s,'#');



str=r[j];



while(!(str=='#' && GetTop(s)=='#'))

{



if(isNum(str))

{

printf("%c",str);

str=r[++j];

}

else

if(proceed(GetTop(s),str)=='<')

{

Push(s,str);

str=r[++j];

}

else

if(proceed(GetTop(s),str)=='>')

{

temp=Pop(s);

printf("%c",temp);

}

else

if(proceed(GetTop(s),str)=='=' &&

GetTop(s)=='(' && str==')')

{

temp=Pop(s);

str=r[++j];

}

}

}

int main(void)

{

/* 此处添加你自己的代码 */

char str[]="3+1*(2+4)#";





printf("%s/n",str); //打印前缀



if(CheckBracket(str)==1) //判断括号是否配对

{

post(str); //处理成后缀并打印出来

}

else

{

printf("Brackets are not matched");

}

printf("/n");

system("pause");

return 0;

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