中綴表達式轉為後綴表達式
**
* 中綴表達式轉後綴表達式
*
* 作用:將一長串計算表達式轉換為計算機易於操作的字符序列,用於計算器的設計
*
* 參與轉換運算符
* +-/*()^%
*
*
* 使用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