1 #include<stdio.h>
  2 #include<stdlib.h>
  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         else
114         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         else
129         {
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

中缀表达式-后缀表达式M相关推荐

  1. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  2. 一行文章让你搞懂什么是前缀、中缀、后缀表达式以及它们之间的相互转换

    一.什么前缀.中缀.后缀表达式(使用 8*(5+6)-1的例子) 1.中缀表达式:8*(5+6)-1:(也就是我们平常所见的运算式) 2.后缀表达式:8 5 6 + * 1 - :计算机是怎么运算的呢 ...

  3. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

    栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...

  4. 前缀,中缀,后缀表达式

    前缀表达式 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前. 例如: ( 3 + 4 ) × 5 − 6 (3+4)×5-6 (3+4)×5−6 对应的前缀表达式就是 - × + 3 4 5 ...

  5. 前缀表达式/中缀表达式/后缀表达式

    前缀表达式/中缀表达式/后缀表达式 中缀表达式就是平常的表达式,如(3+4)*5-6=29 前缀表达式又称为波兰式,也就是运算符位于数字前面,如 -*+3456 后缀表达式又称为逆波兰式,也就是运算符 ...

  6. 中缀表达式 后缀表达式

    一.什么是中缀表达式 & 后缀表达式? 中缀表达式: 我们生活中使用的算术表达式其实就是中缀表达式 举个例子:(1+6/3)*6 - 5 后缀表达式: 更有利于计算机进行计算的一种表达式,不再 ...

  7. C语言实现中缀转后缀表达式,并求值

    C语言实现中缀转后缀表达式,并求值 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #inclu ...

  8. (笔记)前缀,中缀,后缀表达式

    这一部分是王道书上没有的内容,根据视频内容整理 概念 Reverse Polish notation 逆波兰表达式(后缀表达式) Polish notation 波兰表达式(前缀表达式) 中缀表达式: ...

  9. 6 前缀、中缀、后缀表达式

    文章目录 1 前缀表达式 1. 1 缀表达式的计算机求值 2 中缀表达式 3 后缀表达式 3. 1 后缀表达式的计算机求值 3. 2 中缀表达式转换为后缀表达式 1 前缀表达式 前缀表达式又称波兰式, ...

  10. 中缀表达式后缀表达式

    什么是中缀表达式 中缀表达式就是 a+b 这样的,运算符在两个数的中间 什么事后缀表达式 后缀表达式就是 a b + 这样的,运算符在两个数后面 再细分一下 中缀表达式 后缀表达式 a+b-c a b ...

最新文章

  1. Android sqlite 数据库保存Date 类型
  2. 跟我学Kafka源码Producer分析
  3. Ubuntu 8.04 Linux系统下面编译更新内核版本
  4. centos7重装python_CentOS7重装yum和python
  5. Eclipse中安装TestNG插件
  6. c++ byte*长度_9.19秋冬原C日标95白鹅绒超保暖柔软大被子羽绒服 从头到脚的温暖...
  7. SXWIN7X64EN_20181104_NET_msu_LITE英文精简版
  8. 组态王bitset用法_组态王使用问题解答
  9. 峰度的意义_李德荃关于偏度与峰度的讲解
  10. 计算机网络工程专业大学排名,2020网络工程专业大学排名
  11. python银行账户资金交易管理_Python实现银行账户资金交易管理系统
  12. 太阳系各大行星运行轨迹
  13. WINDOWS 7 X86专业版SP1后续补丁包20150901(微软官方下载地址列表)
  14. Python SMTP 163邮箱发送邮件不成功
  15. c#运用——简体字转繁体字
  16. 谷歌R语言代码风格规定:
  17. NTP 服务的配置和使用
  18. Josh 的学习笔记之数字通信(Part 1——信号和频谱)
  19. java虚拟机堆空间
  20. android github轮播图,Android使用开源框架ANDROID-IMAGE-INDICATOR实现图片轮播部署

热门文章

  1. MyBatis快速将MySQL转换成Oracle语句
  2. Android开发笔记(一百四十四)高仿支付宝的头部伸缩动画
  3. DS博客作业03--栈和队列
  4. 你是“细”精你就赢了 游戏开发者怎样做好玩家细分
  5. Android Studio打开React Native创建的项目
  6. ASP.NET MVC 控制器激活(三)
  7. 浅谈百度云计算网络的构建之路
  8. 20世纪50年代开始,数字技术出现,数字计算机开始代替模拟计算机,我们从电气时代逐渐走到了信息时代,电脑重塑了社会的架构与价值。...
  9. [Head First设计模式]生活中学设计模式——组合模式
  10. 大规模C++软件开发 - notes