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

2015-01-24 05:33:10 · 作者: · 浏览: 2
**
 * 中缀表达式转后缀表达式
 * 
 * 作用:将一长串计算表达式转换为计算机易于操作的字符序列,用于计算器的设计
 *
?* 参与转换运算符
 * +-/*()^% 
 * 
 * 
 * 使用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
  
sk=new Stack (); StringBuilder sb=new StringBuilder(); char[] ch=infix.toCharArray(); for(int i=0;i 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