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