栈实现中缀表达式转为后缀表达式

来源:互联网 发布:python中文编码问题 编辑:程序博客网 时间:2024/05/01 05:14
#include<stdio.h>#include<stdlib.h>#include"zhong.h"typedef struct {char data[100];int top;}SeqStack,*PSeqStack;//栈的基本操作PSeqStack Init_seqstack(){PSeqStack S;S=(PSeqStack )malloc(sizeof(SeqStack));if(S)S->top=-1;return S;}int Empty_Seqstack(PSeqStack S){if(S->top==-1)return 1;elsereturn 0;}int Push_seqstack(PSeqStack S,char x){if(S->top==100-1)return 0;else{S->top++;S->data[S->top]=x;        return 1;}}int Pop_seqstack(PSeqStack S,char *x){if(Empty_Seqstack(S))return 0;else{*x=S->data[S->top];S->top--;return 1;}}int  GetTop_seqstack(PSeqStack S,char *x){if(Empty_Seqstack(S))return 0;else*x=S->data[S->top];return 1;}void Destroy_seqstack(PSeqStack *S){if(*S)free(*S);*S=NULL;return ;}//以上是栈的基本操作int IsNum(char c){//判断字符是否是数字if(c>='0'&&c<='9')return 1;elsereturn 0;}int Priority(char op){//判断是否是操作符,并定义优先级switch(op){case '=': return 1;case ')': return 2;case '+': case '-': return 3;case '*':case '/': return 4;case '(': return 5;default:  return 0;}}int infix_exp_value(char *inf,char *pos){//中缀转化为后缀表达式PSeqStack S;char c,w,topelement;S=Init_seqstack();//创建一个栈if(!S){printf("栈的初始化失败!");return 0;}Push_seqstack(S,'=');//将=压入栈中w=*inf;while((GetTop_seqstack(S,&c),c)!='='||w!='='){//遇到操作数则直接输出,w后移一位if(IsNum(w)){*pos=w;pos++;w=*(++inf);}else//如果不是操作符,则根据优先级判断是出栈还是圧栈{if((GetTop_seqstack(S,&c),c)=='('&&w==')'){//满足(),则脱括号Pop_seqstack(S,&topelement);//出栈w=*(++inf);//w后移}else{if((GetTop_seqstack(S,&c),c)=='('||Priority((GetTop_seqstack(S,&c),c))<Priority(w)){//如果栈顶是(或者栈顶优先级小于当前优先级,则当前操作符圧栈Push_seqstack(S,w);w=*(++inf);}else{//如果栈顶的优先级大于w的优先级,则出栈Pop_seqstack(S,&topelement);*pos=topelement;pos++;}}}}*pos='=';*(++pos)='\0';Destroy_seqstack(&S);return 1;}double pos(char *A){//后缀表达式计算PSeqStacki S;double result,a,b,c;//char a,b,c;char ch;ch=*A++;S=Init_seqstacki();while(ch!='='){if(IsNum(ch))Push_seqstacki(S,ch-'0');else{Pop_seqstacki(S,&a);Pop_seqstacki(S,&b);switch(ch){case '+': c=a+b;break;case '-': c=a-b;break;case '*': c=a*b;break;case '/': c=a/b;break;case '%': c=(int)a%(int)b;break;} Push_seqstacki(S,c);}ch=*A++;}GetTop_seqstacki(S,&result);Destroy_seqstacki(&S);return result;}int main(){char a[100],b[100];double x;printf("请输入要计算的表达式:");  scanf("%s",a);getchar();infix_exp_value(a,b);x=pos(b);printf("%.2lf\n",x);return 0;}


原创粉丝点击