码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-12-26 23:01:50      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:

**
 * 中缀表达式转后缀表达式
 * 
 * 作用:将一长串计算表达式转换为计算机易于操作的字符序列,用于计算器的设计
 *
 * 参与转换运算符
 * +-/*()^% 
 * 
 * 
 * 使用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-


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

标签:

原文地址:http://blog.csdn.net/ylqhust/article/details/42177725

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!