博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中缀表达式-后缀表达式M
阅读量:4678 次
发布时间:2019-06-09

本文共 3281 字,大约阅读时间需要 10 分钟。

1 #include
2 #include
3 #define Stack_Size 100 4 #define StackIncrement 10 5 #define Ok 1 6 #define Error 0 7 #define True 1 8 #define False 0 9 #define Overflow -2 10 typedef int status; 11 //字符栈的操作 12 typedef struct 13 { 14 char *base; 15 char *top; 16 int stacksize; 17 }SqStack; 18 status InitStack(SqStack &S) 19 { 20 S.base=(char *)malloc(Stack_Size*sizeof(char)); 21 if(!S.base) exit(Overflow); 22 S.top=S.base; 23 S.stacksize=Stack_Size; 24 return Ok; 25 } 26 status StackEmpty(SqStack &S) 27 { 28 if(S.top==S.base) 29 return True; 30 return False; 31 } 32 status GetTop(SqStack S,char &e) 33 { 34 if(S.top==S.base) return Error; 35 e=*(S.top-1); 36 return Ok; 37 } 38 status Push(SqStack &S,char e) 39 { 40 if((S.top-S.base)==S.stacksize) 41 { 42 S.base=(char *)realloc(S.base,(S.stacksize+StackIncrement)*sizeof(char)); 43 if(!S.base) exit(Overflow); 44 S.top=S.base+S.stacksize; 45 S.stacksize+=StackIncrement; 46 } 47 *S.top++=e; 48 return Ok; 49 } 50 status Pop(SqStack &S,char &e) 51 { 52 if(S.top==S.base) return Error; 53 e=*--S.top; 54 return Ok; 55 } 56 //转化的操作过程 57 static int i=0; 58 status Pass(char *s,char c) 59 { 60 s[i]=c; 61 i++; 62 return Ok; 63 } 64 status In(char c) 65 { 66 switch(c) 67 { 68 case '+': 69 case '-': 70 case '*': 71 case '/': 72 case '(': 73 case ')': 74 case '#':return True; 75 default :return False; 76 } 77 } 78 int Precede(char t1,char t2) 79 { 80 int f=0; 81 switch(t1) 82 { case '+': 83 case '-':if(!(t2=='('||t2=='*'||t2=='/')) 84 f=1; 85 break; 86 case '*': 87 case '/':if(t2!='(') 88 f=1; 89 break; 90 case '(':if(t2=='#') 91 {printf("缺乏左括号\n"); 92 exit(Overflow);} 93 break; 94 case ')':if(t2!='(') 95 f=1; 96 else 97 { 98 printf("括号不匹配\n"); 99 exit(Overflow);100 }101 }102 return f;103 }104 status Converse(char *s)105 {106 SqStack OPTR;107 char ch,x,c=getchar();108 InitStack(OPTR); Push(OPTR,'#');109 while(!StackEmpty(OPTR))110 {111 if(!In(c))112 Pass(s,c);113 else114 switch(c)115 {116 case '(': Push(OPTR,c);break;117 case ')': Pop(OPTR,ch);while(ch!='('){Pass(s,ch);Pop(OPTR,ch);}break;118 default :119 while(GetTop(OPTR,ch)&&Precede(ch,c))120 {121 Pass(s,ch);Pop(OPTR,ch);122 }123 if(c!='#')124 Push(OPTR,c); 125 }126 if(c!='#')127 c=getchar();128 else129 {130 Pop(OPTR,ch);131 Pass(s,ch);132 }133 }134 s[i]='\0';135 return Ok;136 }137 //主函数138 status main()139 {140 char s[100];141 puts("请输入算术表达式:");142 Converse(s);143 puts("转化后的后缀表达式为:");144 puts(s);145 return Ok;146 }

转载于:https://www.cnblogs.com/mycapple/archive/2012/08/03/2620928.html

你可能感兴趣的文章
Java线程的定义
查看>>
UglifyJS 压缩选项
查看>>
面向对象1
查看>>
Python-面向对象(组合、封装与多态)
查看>>
Mininet
查看>>
COSC2531 Programming Fundamentals
查看>>
设计模式系列 - 访问者模式
查看>>
20180507小测
查看>>
前端鼠标点击弹出浮动文字--民主、和谐、爱国、自由等
查看>>
eclipse左侧不见
查看>>
python会缓存小的整数和短小的字符
查看>>
格网与四叉树索引
查看>>
Linux网卡配置文件路径是什么?要使服务器上外网,必须满足的条件有哪些?需要配置什么?...
查看>>
多张照片拍摄、图片浏览
查看>>
html(5) css
查看>>
Azure Web连接到Azure MySql Db
查看>>
《麻辣江湖》即将上线!
查看>>
Mybatis中mapper.xml文件判断语句中的单双引号问题
查看>>
frameset和frame
查看>>
饥饿的小易(规律,同余大数)
查看>>