中缀到后缀的转换

中缀表达式:a+b*c+(d*e+f)*g

转换成后缀表达式:abc*+de*f+g*+


转换步骤:

当读到一个操作数(如:a)时,立即把它放到输出中;

当遇到操作符(如:+)时,将其放入栈中;

当遇到右括号时,弹出栈元素直至遇到左括号。将左括号弹出但不输出;

如果遇到其他操作符[ +, * , (  ] ,那么弹出栈中的元素直到发现优先级更低的元素为止。有一个例外,除非是处理一个 ) 的时候,否则绝不从栈中移走 (


完整的代码:

import java.util.Stack;/*** 中缀到后缀的转换* @author GongQiang**/
public class MiddleToPostExpression {private Stack<Character> stack = new Stack<Character>();/*** @param args** Date	  :2012-6-26* Author :GongQiang*/public static void main(String[] args) {String middleExp = "a+b*c+(d*e+f)*g";MiddleToPostExpression mtpe = new MiddleToPostExpression();System.out.println( mtpe.transform(middleExp) );}public String transform( String middleExp ){StringBuilder sb = new StringBuilder( middleExp.length() );for( int i=0 ; i<middleExp.length() ; i++ ){char c = middleExp.charAt( i );if( operandChar( c ) ){//空栈-->立即插入if( stack.isEmpty() && !rightBracket(c) ){stack.push( c );}// 操作符级别高 || 栈顶元素是'('else if( getLevel(c) > getLevel( stack.peek() ) || leftBracket( stack.peek() ) ){stack.push( c );}// 当前元素不是')' && 级别比栈顶元素低 && 栈顶元素不是')'else if( !rightBracket(c) && getLevel(c) <= getLevel( stack.peek() ) && !leftBracket( stack.peek() )){while( !stack.isEmpty() && getLevel(c) <= getLevel( stack.peek() ) && !leftBracket( stack.peek() ) ){sb.append( stack.pop() );}stack.push( c );}// 当前元素是')'else if( rightBracket( c ) ){while( !leftBracket( stack.peek() ) ){sb.append( stack.pop() );}stack.pop(); //弹出 '('}}else{sb.append( c );}}//弹出栈中剩下的元素while( !stack.isEmpty() ){sb.append( stack.pop() );}return sb.toString();}/*** 是操作符 ?* @return** Date	  :2012-6-26* Author :GongQiang*/private boolean operandChar( char c ){char[] operands = { '+', '*', '(', ')' };for( char op : operands ){if( c == op ){return true;}}return false;}private boolean leftBracket( char c ){return c == '(' ? true : false;}private boolean rightBracket( char c ){return c == ')' ? true : false;}private int getLevel( char c ){if( c == '+' ){return 1;}if( c == '*' ){return 2;}if( c == '(' ){return 1024;}// 右括号return -1;}
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CES 2018即将揭幕:AI平台之争烽烟骤起

来源&#xff1a;机器人创新生态概要&#xff1a;一年一度的国际消费电子展&#xff08;CES&#xff09;即将揭开序幕&#xff0c;今年有哪些值得观察的热门技术呢&#xff1f;一年一度的国际消费电子展&#xff08;CES&#xff09;即将揭开序幕&#xff0c;今年有哪些值得观察…

后缀表达式转变成表达式树

后缀表达式&#xff1a;abcde** 转换的表达式树&#xff1a; 转换步骤&#xff1a; 如果符号是操作数&#xff0c;那么就建立一个单节点树并将它推入栈中。 如果符号是操作符&#xff0c;那么就从栈中弹出两颗树 T1 和 T2 &#xff08;T1 先弹出&#xff09;并形成一棵新的树…

linux用户组登录,linux用户和用户组

1.用户组和权限管理用户分为三类&#xff1a;1.1 超级用户&#xff1a;root uid0,简单来说uid为0的用户就是超级用户。1.2 虚拟用户&#xff1a;存在linux中&#xff0c;满足文件或者程序运行的需要&#xff0c;而创建的。不能登录&#xff0c;不能使用。uid1-499,1-999(centos…

人工智能和厨房电器的结合:厨房助理机器人

来源&#xff1a;人工智能学家AItists概要&#xff1a;从智能家居到无人驾驶&#xff0c;人工智能正在落地的道路上。而其中一个让人觉得有点意外也很有趣的场景是&#xff1a;厨房。从智能家居到无人驾驶&#xff0c;人工智能正在落地的道路上。而其中一个让人觉得有点意外也很…

查找N个数中第K大的数

方法一&#xff1a;将一组数放入数组中&#xff0c;升排序。并返回第 ( length - k )个元素这里消耗的时间就是排序用的时间&#xff0c;用快速排序则为&#xff1a;O( N log N )代码&#xff1a; /*** 先排序后获取* return** Date :2012-7-4* Author :GongQiang*/public in…

美国科学院学报:如何在竞争激烈的环境下维持稳定的群体

行为决策演化示意图。最上面一行是混合群体&#xff0c;下面两行是网络群体。相比于混合群体&#xff0c;网络促使合作者聚集成团簇&#xff0c;但是惩罚的加入将破坏合作环境。来源&#xff1a;中国科学院西安光机所李学龙研究员同合作者在数据驱动的行为决策研究方面取得阶段…

linux文本处理脚本题,Linux文本处理工具sed练习题

1、使用sed命令打印出ifconfig ens33的ip地址解:(1)ifconfig ens33 | sed -n 2p | sed s/.*inet // | sed s/netmask.*//(2)ifconfig ens33 | sed -n 2p | sed -r s/.*inet (.*)netmask.*/\1/(3)ifconfig ens33 | sed -r -n 2s/.*inet (.*)netmask.*/\1/p2、使用sed命令打印出系…

全球首个Magic Leap One体验:吓到你不敢进房间

来源&#xff1a;智东西概要&#xff1a;业内备受关注的AR技术公司Magic Leap&#xff0c;在获得19亿美元融资历经七年之后&#xff0c;终于放出其第一款头盔产品Magic Leap One&#xff0c;很快在科技圈、VR圈引起刷屏式关注。昨夜&#xff0c;业内备受关注的AR技术公司Magic …

ftp+linux+使用webdav,群晖-win/mac/nfs ftp tftp webdav文件服务的概念及设置

应用程序级别WebDAV 是一个 HTTP 的扩充服务&#xff0c;可让用户编辑和管理存储在远程服务器上的文件。通过 Synology DiskStation Manager 的 WebDAV 服务&#xff0c;支持 WebDAV 的客户端程序(如 Windows 资源管理器、Mac OS Finder、Linux 资源管理器)将能够远程访问 Syno…

二叉堆

满足如下结构性和堆序性&#xff0c;即为二叉堆。 结构性质&#xff1a;堆是一棵被完全填满的二叉树&#xff0c;有可能的例外是在底层&#xff0c;底层上的元素从左到右填入。这样的树称为完全二叉树。 容易证明&#xff0c;一棵高为 h 的完全二叉树有 2h 到 2h1-1 个节点。这…

linux模式匹配运算符,linux之正则表达式

文件查找的需要&#xff1a;grep:(GLOBAL Research) 根据模式(网)去搜索文本&#xff0c;而后将符合模式的文本行显示出来。【部分匹配&#xff0c;显示时显示一行】Pattern&#xff1a;模式。(文本字符以及正则表达式元字符组合而成的匹配条件)例子&#xff1a;grep‘root’/e…

伯克利AI研究院解析「反向课程学习」,改善「强化学习智能体」并应用于机器人技术

原文来源&#xff1a;arXiv作者&#xff1a;Wieland Brendel、Jonas Rauber、Matthias Bethge「雷克世界」编译&#xff1a;嗯~阿童木呀、哆啦A亮众所周知&#xff0c;强化学习&#xff08;RL&#xff09;是一种强大的技术&#xff0c;它能够解决诸如移动&#xff08;locomotio…

《Science》评选2017年十大科学突破,看看有哪些吧!

来源&#xff1a;材料科学与工程概要&#xff1a;美国《科学》杂志21日公布了其评选出的2017年十大科学突破&#xff0c;人类首次观测到双中子星并合事件被选为头号科学突破。美国《科学》杂志21日公布了其评选出的2017年十大科学突破&#xff0c;人类首次观测到双中子星并合事…

linux 第三章红帽子,红帽子 Linux_命令全解

118.Ctrlz 把程序放入后台运行-暂停状态&#xff0c;Ctrlc 终止进程&#xff0c;整洁关闭119.jobs 作业列表120.bg [%作业号] 后台恢复运行121.fg [%作业号] 前台恢复运行122.(date;who | wc -l ) >> logfile 聚集命令()&#xff0c;生成subshell全部发送123.echo $? 保…

PL/SQL-FOR UPDATE 与 FOR UPDATE OF的区别

数据库 oracle for update of 和 for update区别 select * from TTable1 for update 锁定表的所有行&#xff0c;只能读不能写 2 select * from TTable1 where pkid 1 for update 只锁定pkid1的行 3 select * from Table1 a join Table2 b on a.pkidb.pkid for u…

2017年深度学习重大研究进展全解读

来源&#xff1a;机器之心概要&#xff1a;想知道哪些深度学习技术即将影响我们的未来吗&#xff1f;本文将给你作出解答。2017 年只剩不到十天&#xff0c;随着 NIPS 等重要会议的结束&#xff0c;是时候对这一年深度学习领域的重要研究与进展进行总结了。来自机器学习创业公司…

linux管道符加空格吗,管道符,作业控制,变量以及变量配置文件

一、管道符前面已经提过过管道符 “|”, 就是把前面的命令运行的结果丢给后面的命令。# cat 1.txt | wc -l //显示1.txt文件行数二、作业控制当运行进程时&#xff0c;你可以使它暂停(按CtrlZ组合键)&#xff0c;然后使用fg(foreground的简写)命令恢复它&#xff0c;或是利用bg…

PL/SQL 连接配置

PLSQL连接oracle数据库配置 方法一&#xff1a; 1&#xff09;点击Net Configuration Assistant 2) 在弹出的对话框中选择本地Net服务名配置&#xff0c;点下一步 3&#xff09; 在服务名配置对话框中选择添加&#xff0c;点下一步 4&#xff09;在如下对话框中填写要访问的ora…

自动驾驶汽车硬件与软件技术介绍

来源&#xff1a;知乎概要&#xff1a;本文详细介绍了自动驾驶汽车的硬件和软件&#xff0c;以及所需要做的准备工作&#xff0c;每个研发者或者准备投身于无人驾驶领域的人都应该好好看一下。全球有数不清的公司在忙着研发自动驾驶汽车&#xff0c;他们的产品也千奇百怪&#…

linux数组随机数,随机数与数组

随机数数组变量清屏时间延迟静态网站HTML随机数srand()函数用于播种函数头文件: stdlib.h函数定义: void srand(unsigned int seed)函数功能:设置随机数种子函数说明:通常可以用getpid(获取当前进程的进程识别码)或者time(NULL)(获取当前系统的时间信息)来充当种子&#xff0c;…