中缀表达式转为后缀表达式

**
 * 中缀表达式转后缀表达式
 *
 * 作用:将一长串计算表达式转换为计算机易于操作的字符序列,用于计算器的设计
 *
 * 参与转换运算符
 * +-/*()^%
 *
 *
 * 使用StringBuilder来保存转换出的后缀表达式
 * 使用栈来操作运算符
 *
 *
 * 转换原则
 * 1.上述字符中()没有优先级值,+-优先级值为1,/*%优先级值为2,^优先级值为3
 * 2.对于一个待计算的表达式,从左向右逐个检查每个字符
 * 3.遇到数字,直接append到StringBuilder
 * 4.遇到 ( 括号,直接push入栈
 * 5.遇到 ) 括号,pop出栈中的操作符并append到StringBuilder中直到遇到 ( 括号,如果在栈空之前没有发现 ( 括号,抛出异常
 * 6.对于其他操作符,如果栈顶是 ( ,直接push入栈
 * 7.否则,如果栈顶操作符优先级值大于它,则在栈不空之前,pop出栈中的操作符并append到StringBuilder中,
 * 直到遇到比它优先级小的操作符,这个比它优先级小的操作符不出栈,最后将此操作符push入栈中
 * 8.检查完每一个字符后,如果栈中还有操作符,将这些操作符直接append到StringBuilder中
 *
 * 最后StringBuilder中保存的就是后缀表达式
 * **/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class change {
	public static void main(String[] args) throws IOException{
		intopost itp=new intopost();
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		String infix,postfix=null;
		while((infix=bf.readLine())!=null){
			postfix=itp.inToPost(infix);
			System.out.println(postfix);
		}
	}
}

class intopost{
	 public String inToPost(String infix){
		 Stack<operator> sk=new Stack<operator>();
		 StringBuilder sb=new StringBuilder();
		 char[] ch=infix.toCharArray();
		 for(int i=0;i<ch.length;i++){
			 if(Character.isDigit(ch[i]))
				 sb.append(ch[i]);
			 else
				 operators(sb,sk,ch[i]);
		 }
		 while(!sk.isEmpty()){
			 sb.append(sk.pop().tmp);
		 }
		 return sb.toString();
	 }

	 //对非数字部分进行处理
	 public void operators(StringBuilder sb,Stack<operator> sk,Character ch){
		 operator chh=new operator(ch);
		 if(sk.isEmpty() || ch.equals('(') || sk.peek().tmp.equals('(')){
			 sk.push(chh);
			 return;
		 }
		 if(ch.equals(')')){
			 if(sk.isEmpty())
				 throw new RuntimeException();
			 while(!sk.peek().tmp.equals('(')){
				 sb.append(sk.pop().tmp);
				 if(sk.isEmpty())
					 throw new RuntimeException();
			 }
			 sk.pop();
			 return;
		 }
		 if(chh.RANK<sk.peek().RANK)
		 while((!sk.isEmpty()) && (!sk.peek().tmp.equals('(')) && chh.RANK<=sk.peek().RANK){
			 sb.append(sk.pop().tmp);
		 }
		 sk.push(chh);
	 }
 }

///操作符类
class operator{
	 int RANK;
	 Character tmp;
	 public operator(Character ch){
		 	 this.tmp=ch;
		 	 if(ch.equals('+') || ch.equals('-'))
				 this.RANK=1;
			 if(ch.equals('*') || ch.equals('/') || ch.equals('%'))
				 this.RANK=2;
			 if(ch.equals('^'))
				 this.RANK=3;
		 }
	 }

//测试结果

输入 1-2*(3^6-((9-8)*6)^2*6)-8

输出 1236^98-6*2^6*-*-8-

时间: 2024-12-24 13:05:03

中缀表达式转为后缀表达式的相关文章

表达式的计算(中缀表达式转为后缀表达式或逐步计算)

算数表达式的计算,也是很基础的一个问题.花了点时间写了下. 网上很多正确代码.但没有详细说明.虽然不复杂,但是还是写详细点.只有仔细思考过.问题才会在头脑中,觉得简单. 基本有2种方法. 1)中缀表达式转为后缀表达式,是最简洁有力的方法. 2)符合人的计算思路的逐步方法,不推荐使用,只适合锻炼下逻辑能力. 一.中缀表达式转为后缀表达式,是最简洁有力的方法. //更简洁通用的算法,就是把中缀表达式转换为后缀表达式.后缀表达式:不包含括号,运算符放在两个运算对象的后面. //一,无括号的n级符号算法

栈的应用:中缀表达式转为后缀表达式

1.中缀表达式转为后缀表达式 规则:(栈实现) 1)如果遇到操作数,我们就直接将其输出. 2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中. 3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止.注意,左括号只弹出并不输出. 4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止.弹出完这些元素后,才将遇到的操作符压入到栈中.有一点需要注意,只有在遇到" ) "的情况下

计算器核心算法——中缀表达式转为后缀表达式

中缀表达式转后缀表达式的过程类似编译过程——四则运算表达式中的括号必须匹配——根据运算符优先级进行转换——转换后的表达式中没有括号——转换后可以顺序的计算出最终结果 这是某位伟人研究出的算法,在这里我们直接拿来用就可以. 转换过程:——当前元素e为数字:输出——当前元素e为运算符:1.与栈顶运算符进行优先级比较2.小于等于:将栈顶元素输出,转13.大于:将当前元素e入栈 ——当前元素e为左括号:入栈——当前元素e为右括号:1.弹出栈顶元素并输出,直至栈顶元素为左括号2.将栈顶的左括号从栈中弹出

JavaScript实现计算后缀表达式(逆波兰表达式)以及将中缀表达式转为后缀表达式

逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子: 正常的表达式 逆波兰表达式 a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)d ---> a,d,b,c,-,,+ a=1+3 ---> a=1,3 + http=(smtp+http+telnet)/1024 写成什么呢? http=smtp,http,telnet,+,+,1

利用栈将中缀表达式转为后缀表达式

#include<iostream>#include<stdio.h>using namespace std;#include<stack>const int SM = 40;int Precedence(char op){    //返回运算符op所对应的优先级数值    switch (op){    case '+':    case '-':return 1;//定义加减运算的优先级为1    case '*':    case '/':return 2;//定

[转]中缀表达式、前缀表达式、后缀表达式的相互转换

--------------------------------后缀转中缀---------------------------------------------- 1.建立一个栈,从左向右扫描后缀表达式,遇到运算数则压入栈: 2.遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果作为新的运算符再压入栈: 3.依次走到表达式结尾: 例:把逆波兰式(即后缀表达式)ab+c*转换为中缀表达式: 1)a入栈(0位置) 2)b入栈(1位置) 3)遇到运算符"+",将a和b出栈,执行a+b的

数据结构中缀表达式转后缀表达式以及后缀转中缀表达式

最近一直在看数据结构这本书,我相信,对于每个程序员来说,数据结构都尤为重要.为什么要学,可以看看这位博友的认识http://blog.csdn.NET/sdkfjksf/article/details/54380659 直入主题:将中缀表达式转为后缀表达式 以及将后缀表达式转为前缀表达式的实现. 关于后缀转中缀,中缀转后缀的理论介绍,请先阅读其互转的理论知识,或者我转发的这篇文章,这里不再累赘,最好参考<数据结构与算法描述Java语言版>,接下来将会用java写. 一.首先,怎么实现中缀表达式

逆波兰表达式——中缀表达式转后缀表达式

逆波兰表达式 先说一下中缀表达式,平时我们使用的运算表达式就是中缀表达式,例如1+3*2,中缀表达式的特点就是:二元运算符总是置于与之相关的两个运算对象之间 人读起来比较好理解,但是计算机处理起来就很麻烦,运算顺序往往因表达式的内容而定,不具规律性 后缀表达式,后缀表达式的特点就是:每一运算符都置于其运算对象之后,以上面的中缀表达式1+2*3为例子,转为后缀表达式就是123*+ 下面先分析怎么把中缀表达式转换为后缀表达式,这里我们考虑六种操作符'+'.'-'.'*'.'/'.'('.')',完成

中缀表达式转后缀表达式(Java代码实现)

后缀表达式求值 后缀表达式又叫逆波兰表达式,其求值过程可以用到栈来辅助存储.例如要求值的后缀表达式为:1 2 3 + 4 * + 5 -,则求值过程如下: 遍历表达式,遇到数字时直接入栈,栈结构如下 2. 接着读到 “+”操作符,则将栈顶和次栈顶元素出栈与操作符进行运算,执行 2 + 3操作,并将结果5压入栈中,此时栈结构如下 3.  继续读到4,是数字则直接压栈,此时栈结构如下 4. 继续向后读取,此时读取到操作符“*”,则将栈顶和次栈顶元素出栈与操作符进行运算,即执行 5 * 4 ,然后将结