Input

若干行,每行对应一个中缀表达式

Output

若干行,每行对应一个由中缀表达式转换而来的后缀表达式

Sample Input

X+A*(Y-B)-Z/F
A+B*C+(D*M-N)+(S-T)*Y
A-B*C+(D-E*F)/G

Sample Output

XAYB-*+ZF/-
ABC*+DM*N-+ST-Y*+
ABC*-DEF*-G/+

解题思路:

首先如何实现中缀表达式转换成后缀表达式,方法如下

1.首先划分优先级(运算符优先级可参考课本53页)
2. * 和 / 优先级大于 + 和 -   "(" 和 ")"我们这里做特殊处理  设定 #号的优先级最低

3.依次扫描中缀表达式 建立两个栈,Sa 和 Sb。Sb中存放运算符,初始化直接将一个#号压入Sb栈底,方便后续操作

4.操作规则是:

(1)如果遇到操作数 压入Sa

(2)如果是运算符  则与Sb栈顶运算符比较优先级,若优先级高于栈顶运算符,则入栈,若小于等于栈顶运算  符,则栈顶运算符出栈,并且压入Sa,然后继续和栈顶运算符比较,直到高于栈顶运 算符优先级,将其压入Sb.

5.特别的 如果遇到左括号  直接压入Sb.然后继续按照上述规则操作,直到遇到右括号时,右括号不压入,将Sb中左括号后的运算符依次弹出并压入Sa.然后弹出左括号

6.中缀表达式扫描完后,将Sb中剩余的运算符依次弹出并压入Sa.

7. 退栈输出Sa.

以上过程请在草稿纸上自己用样例数据实验一遍,理解更加透彻。

ps:特别注意,因为需要比较各个运算符的优先级  故自定义数据类型ElemType

typedef struct node{char ch;//元素 int level;//优先级
}ElemType;//数据结构 

具体代码及注释如下:

#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct node{char ch;//元素 int level;//优先级
}ElemType;//数据结构
typedef struct{ElemType *base;ElemType *top;
}LinkStack;//栈 int InitStack(LinkStack *L)//初始化
{//这里只是为了A题 直接申请足够空间  未设置增加空间操作 L->base=(ElemType *)malloc(sizeof(ElemType)*10000);L->top=L->base;
}
int push(LinkStack *L,ElemType elem)//压栈
{L->top->ch=elem.ch;char c=elem.ch;L->top->level=elem.level;L->top+=1;
}
int compare(LinkStack *S,ElemType elem)//比较运算符的优先级
{S->top-=1;int flag= (S->top->level);//将栈顶运算符优先级赋给flag S->top+=1;if( flag >= elem.level){return 1;}if( flag < elem.level){return 0;}
}
int pop(LinkStack *L)//弹栈
{while(L->base!=L->top){printf("%c",L->base->ch);L->base+=1;}
}
int main()
{char a[1000];while(gets(a))//输入字符串 {int l=strlen(a);ElemType b[1000];for(int i=0;i<l;i++)//给运算符划分优先等级 {if(a[i]=='+'||a[i]=='-'){b[i].ch=a[i];b[i].level=1;}else if(a[i]=='*'||a[i]=='/'){b[i].ch=a[i];b[i].level=2;}else if(a[i]=='('||a[i]==')'){b[i].ch=a[i];b[i].level=-1;}else{b[i].ch=a[i];b[i].level=100;//操作数可以不赋优先级 }}LinkStack L,S;InitStack(&L);//存放后缀表达式 InitStack(&S);//存放运算符 ElemType F;F.ch='#';F.level=-2;//压入#号 push(&S,F);ElemType r;//用来传递给函数的一个中间变量 for(int i=0;i<l;i++){//若是运算符进行判断 if(b[i].ch=='+'||b[i].ch=='-'||b[i].ch=='*'||b[i].ch=='/'||b[i].ch=='('||b[i].ch==')'||b[i].ch=='#'){if(b[i].ch=='(')//若是左括号  直接压栈 {push(&S,b[i]);continue;}if(b[i].ch==')')//若是右括号  将运算符弹出  放到操作数栈中   {S.top-=1;while(S.top->ch!='(')//直到遇到左括号  结束 {r.ch=S.top->ch;push(&L,r);S.top-=1;    }continue;}while(compare(&S,b[i]))//比较优先级 ! {S.top-=1;         //若a[i]优先级高于栈顶运算符  压栈 r.ch=S.top->ch;   // 若不高于  则栈顶元素出栈 入操作数栈 push(&L,r);       // 然后继续和前一个比较  }                     // 直到遇到比a[i]优先级低的 跳出循环 push(&S,b[i]);        // a[i]入栈 }else//操作数直接压入操作数栈 {push(&L,b[i]);}}//字符串扫描完  将剩余的运算符依次入操作数栈 S.top-=1;r.ch=S.top->ch;while(S.top!=S.base){push(&L,r);S.top-=1;r.ch=S.top->ch;}//退栈输出后缀表达式 pop(&L);printf("\n");}}

后缀表达式----栈相关推荐

  1. C++做四则运算的MFC计算器(二)栈转换和计算后缀表达式

    上篇写了MFC界面搭建,这篇就写实现计算.涉及到数据结构,对新手很不友好. 虽然是MFC程序,但是能灵活地分离后台代码,自行构建控制台程序. 上一篇文章链接:C++做四则运算的MFC计算器(一)MFC ...

  2. Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现

    1.堆栈-Stack 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  3. 信息竞赛进阶指南--中缀表达式转后缀表达式并求值(模板)

    // 后缀表达式转中缀表达式,同时求值,O(n)// 数值栈 vector<int> nums; // 运算符栈 vector<char> ops;// 优先级 int gra ...

  4. 中缀、前缀和后缀表达式

    逆波兰表达式 先说一下中缀表达式,平时我们使用的运算表达式就是中缀表达式,例如1+3*2,中缀表达式的特点就是:二元运算符总是置于与之相关的两个运算对象之间 人读起来比较好理解,但是计算机处理起来就很 ...

  5. 数据结构——栈——中缀表达式和后缀表达式

    什么是中缀表达式,什么是后缀表达式 我们一般看见的多项式计算都是中缀表达式构成的:1+2*3+4/3 类似这种,为什么说是中缀呢?因为它的计算符号都是在两个数中间的. 那么自然而然的明白了后缀表达式是 ...

  6. 栈的应用_中缀表达式转后缀表达式

    中缀表达式就是我们习惯的表达式比如说1+2*3,后缀表达式是计算机习惯的表达式. 1+2*3转成后缀表达式后:123*+ 中缀转后缀算法: - 遍历中缀表达式中的数字和符号: - 对于符号: - 左括 ...

  7. 【Python】洛谷 P1175_表达式的转换(逆波兰式、中缀表达式、后缀表达式、栈)

    目录 题目 代码 AC截图 题目 代码 碎碎念:我用来复习栈的,刷了巨长时间,一直Runtine Error,编译直接就没有过. 好家伙,然后发现是数据给的不够严谨,左右两端有空格,使用strip() ...

  8. 前、中、后缀表达式概述及转换+栈的计算器原理及代码分析(含完整源码)

    目录: 1.前中后缀表达式的概述 2.中序表达式转前后缀表达式 3.运用栈的后缀表达式实现计算器原理步骤 4.代码实现和分析 1.前中后缀表达式的概述及相互转换 前缀表达式:运算符位于操作数之前. 中 ...

  9. 数据结构-栈应用之逆波兰表达式(后缀表达式)

    逆波兰表达式含义我就不做赘述了,摘自百科上的一段话: 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示.波兰逻辑学家J.Lukas ...

  10. 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)

    [0]README 0.1) 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤,并给出源代码实现: 0.2) 本文中涉及到的源代码均为原创,是对中缀转后缀和计算后缀的简单实现,(旨在理 ...

最新文章

  1. 一作解读:Microbiome马铃薯疮痂病与土壤微生物组关系新进展
  2. ios开发判断字符串为空_【开发常识】这个问题,直接导致年终奖没了……(惨兮兮)...
  3. Coolite 常用客户端校验
  4. Lucene 学习笔记(一)
  5. Python中菱形继承的MRO顺序及property属性
  6. ubuntu清除无效的右键打开方式
  7. java 第三方序列化,11.既然有第三方的序列化方式,说明java官方提供的序列化方式应该有一些很明显或者很致命的缺点……...
  8. POJ3264Balanced Lineup(最基础的线段树)
  9. 域名/网站名/URL
  10. QQ坦白说v1.1 软件 源码 解析
  11. 嵌入式Linux应用开发
  12. 计算机二级考试科目vfp,计算机二级考试科目及内容
  13. 类风湿性关节炎中的肠-关节轴
  14. 如何给PDF文件加密和解密?
  15. php限制一天抽奖次数_PHP可以修改概率的抽奖算法(例如转盘等,个人感觉蛮好用)...
  16. [转发]知识图谱 (Knowledge Graph) 专知 荟萃
  17. 码一些有用的东西网站的域名被拦截怎么办? 教你快速解除各种拦截
  18. 根据IP获取坐标(经纬度)
  19. Android设置状态栏颜色,沉浸式状态栏 fllutter Android设置沉浸式状态栏
  20. r710安装exsi_Dell服务器安装EXSI系统

热门文章

  1. 何建坤:实施能源革命战略 促绿色低碳发展
  2. .net面试问答(大汇总)(转)
  3. java javascript 的编码
  4. XNA Game Studio 2.0安装问题,崩溃了
  5. ant基本命令和使用
  6. 最佳实践:阿里云VPC、ECS支持IPv6啦!
  7. mycat启动服务,后台日志报错Bit Server VM warning: ignoring option MaxPermSize
  8. 解决Maven关于本地jar包的打包处理
  9. 获取当前实例的字段值
  10. 《Effective Java》,关于异常