前言

This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。

提出问题

22.Algorithm Gossip: 中序式转后序式(前序式)

说明

平常所使用的运算式,主要是将运算元放在运算子的两旁,例如a+b/d这样的式子,这称之为中序(Infix)表示式,对于人类来说,这样的式子很容易理 解,但由于电脑执行指令时是有顺序的,遇到中序表示式时,无法直接进行运算,而必须进一步判断运算的先后顺序,所以必须将中序表示式转换为另一种表示方 法。可以将中序表示式转换为后序(Postfix)表示式,后序表示式又称之为逆向波兰表示式(Reversepolish notation),它是由波兰的数学家卢卡谢维奇提出,例如(a+b)(c+d)这个式子,表示为后序表示式时是ab+cd+

解法

用手算的方式来计算后序式相当的简单,将运算子两旁的运算元依先后顺序全括号起来 ,然后将所有的右括号取代为左边最接近的运算子(从最内层括号开始),最后去掉所有的左括号就可以完成后序表示式。
如果要用程式来进行中序转后序,则必须使用堆叠,演算法很简单,直接叙述的话就是使用回圈,取出中序式的字元,遇运算元直接输出,堆叠运算子与左括号, ISP>ICP的话直接输出堆叠中的运算子,遇右括号输出堆叠中的运算子至左括号。如果要将中序式转为前序式,则在读取中序式时是由后往前读取,而左右括号的处理方式相反 ,其余不变,但输出之前必须先置入堆叠,待转换完成后再将堆叠中的 值由上往下读出,如此就是前序表示式。

分析和解释

代码

C 代码演示

#include <stdio.h>
#include <stdlib.h>
int postfix(char*); // 中序转后序
int priority(char); // 决定运算子优先顺序
int main(void) {char input[80];printf("输入中序运算式:");scanf("%s", input);postfix(input);return 0;}
int postfix(char* infix) {int i = 0, top = 0;char stack[80] = {'\0'};char op;while(1) {op = infix[i];switch(op) {case '\0':while(top > 0) {printf("%c", stack[top]);top--;}printf("\n");return 0;// 运算子堆叠case '(':if(top < (sizeof(stack) / sizeof(char))) {top++;stack[top] = op;}break;case '+': case '-': case '*': case '/':while(priority(stack[top]) >= priority(op)) {printf("%c", stack[top]);top--;}// 存入堆叠if(top < (sizeof(stack) / sizeof(char))) {top++;stack[top] = op;}break;// 遇 ) 输出至 (case ')':while(stack[top] != '(') {printf("%c", stack[top]);top--;}top--; // 不输出(break;// 运算元直接输出default:printf("%c", op);break;}i++;}}
int priority(char op) {int p;switch(op) {case '+': case '-':p = 1;break;case '*': case '/':p = 2;break;default:p = 0;break;}return p;}

拓展和关联

后记

参考书籍

  • 《经典算法大全》
  • 维基百科

转载于:https://www.cnblogs.com/actanble/p/6713394.html

Algorithm Gossip (22) 中序式转后序式(前序式)相关推荐

  1. 二叉树、前序遍历、中序遍历、后序遍历

    一.树 在谈二叉树前先谈下树和图的概念 树:不包含回路的连通无向图(树是一种简单的非线性结构) 树有着不包含回路这个特点,所以树就被赋予了很多特性 1.一棵树中任意两个结点有且仅有唯一的一条路径连通 ...

  2. c++ 删除二叉树的子树_数据结构—树|二叉树|前序遍历、中序遍历、后序遍历【图解实现】...

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 数据 结构 二叉树的遍历 一.树 在谈二叉树的知识点之前,我们首先来看一下树和图的基本概念.树:不包含回路的连通无向图,树是一种简单的非线性结构 ...

  3. 二叉树的前序遍历、中序遍历、后序遍历

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 为什么需要树这种数据结构 树的常用术语 二叉树的概念 二叉树遍历的说明 实现二叉树 实现二叉树的遍历 二叉树查找结点 二叉树 ...

  4. 二叉树(Binary Tree):先序遍历、中序遍历、后序遍历和层次遍历

    二叉树(Binary Tree):先序遍历.中序遍历.后序遍历和层次遍历 树 Tree 二叉树 Binary Tree 先序遍历 Preorder Traversal 中序遍历 Inoreder Tr ...

  5. 二叉树的前序遍历,中序遍历,后序遍历-详解-配套例题

    二叉树作为数据结构中一种简单而且重要的数据结构,他的存储结构和算法都相对比较简单,因此他也显得特别重要,因为很多问题都可以抽象为二叉树的问题. 在这里我们对于二叉树的基本概念不做详细介绍,我们这里主要 ...

  6. [算法] 二叉树的 先序遍历、中序遍历、后序遍历

    本文根据清华大学邓俊辉老师课程<数据结构>总结,课程地址 . 遍历介绍 按照事先约定的某种规则或次序,对节点各访问一次而且仅一次.与向量和列表等线性结构一样,二叉树的这类访问也统称为遍历( ...

  7. C++实现二叉树相关问题(先序遍历,中序遍历,后序遍历,层序遍历,搜索二叉树、平衡二叉树、满二叉树、完全二叉树的判断,最低公共祖先,二叉树的序列化和反序列化)

    目录 题目一 二叉树递归和非递归遍历 题目二 如何完成二叉树的宽度(也叫层序)遍历(常见题目:求一棵二叉树的宽度) 题目四 如何判断一棵二叉树是搜索二叉树(BST)? 题目四 如何判断一棵二叉树是平衡 ...

  8. python实现二叉树遍历(前序遍历、中序遍历、后序遍历)

    python实现二叉树遍历(前序遍历.中序遍历.后序遍历) 在计算机科学中,二叉树是一种树数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点.使用集合理论概念的递归定义是(非空)二叉树是元 ...

  9. 二叉树的前序遍历,中序遍历,后序遍历学习 (原)

    经验: 不要死记各个遍历节点的位置,将一个复杂的二叉树当作一个个小的二叉树学习前序遍历,中序遍历,后序遍历会更容易理解 转载于:https://www.cnblogs.com/gyrgyr/p/962 ...

最新文章

  1. 从数据中心基础设施的视角来看 Facebook 机器学习的应用
  2. linux终端显示被覆盖,图文说明:Linux监控命令全覆盖
  3. linux文件属性 -rwxr-xrw,Linux文件属性
  4. 日志框架,选择Logback Or Log4j2?
  5. 微信彩色个性昵称 游戏取名 九宫格切图 多图拼接工具箱微信小程序源码
  6. iOS平台经典游戏《合金弹头X》上架 售价25元
  7. 【转】【异常处理】Incorrect string value: ‘\xF0\x90\x8D\x83...‘ for column... Emoji表情字符过滤的Java实现
  8. 排队论的计算机模拟,系统容量有限的一类排队论模型的计算机模拟研究
  9. Pymol入门教程--基础
  10. 18个Java开源CMS系统一览
  11. 【漏洞】——心脏滴血(CVE-2014-0160)
  12. 时空序列预测之PredRNN++(Casual LSTM和GHU解决时空预测学习中的深度困境)
  13. 蜂群 matlab,人工蜂群算法
  14. C++ QT调用python脚本并将软件打包发布
  15. 思科5505/5506防火墙配置與範例
  16. “燕云十六将”之Jason郝钰(12)
  17. 寻找AR中的Big Difference - v3.0 | AR指南
  18. CentOS 7 Nginx 控制脚本
  19. 【AutoSAR】【ComM】通信管理
  20. pdf.js改成base64方式加载

热门文章

  1. UrlPager免费分页控件2.0版发布!
  2. 解决MySQL server has gone away
  3. php中区分大小写的超全局变量总结
  4. linux 下DHCP的安装
  5. VC Post-build使用心得
  6. OSChina 周一乱弹 —— 抱着漂亮袜子就亲了一口
  7. codevs1217 借教室 题解
  8. phpFastCache
  9. 如何利用CSS给同一个网页中的超链接设置设置不同的样式?
  10. Ubuntu ADSL 拨号上网时断时续问题