表达式求值

来源:互联网 发布:淘宝刷钻平台源码 编辑:程序博客网 时间:2024/06/07 02:32





5-9 表达式转换   (25分)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:

输入在一行中给出不含空格的中缀表达式,可包含+-*\以及左右括号(),表达式不超过20个字符。

输出格式:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:

2+3*(7-4)+8/4

输出样例:

2 3 7 4 - * + 8 4 / +


import java.util.Scanner;import java.util.Stack;public class Main{static String midToPost(String str){char[] ch=str.toCharArray();Stack<Character> stack=new Stack<Character>();StringBuilder sb=new StringBuilder();boolean flag=true;for(int i=0;i<ch.length;i++){char c=ch[i];switch(c){case '(':stack.push(c);break;case ')':while(stack.peek()!='('){sb.append(stack.pop());}stack.pop();break;case '-':case '+':if(!( i!=0 && (( Character.isDigit(ch[i-1]) && Character.isDigit(ch[i+1]) || ch[i+1]=='(' ) || ch[i-1]==')' ))){if(i!=0)sb.append("#");if(c=='+'){  sb.append("@");}else{sb.append("!");}flag=true;}else{while(!stack.isEmpty() && stack.peek()!='('){sb.append(stack.pop());}stack.push(c);flag=false;}break;case '/':case '*':while(!stack.isEmpty() && stack.peek().toString().matches("[*/]")){sb.append(stack.pop());}stack.push(c);flag=false;break;default:if(flag==false){sb.append('#');}sb.append(c);flag=true;break;}}while(!stack.isEmpty()){sb.append(stack.pop());}return sb.toString();}public static void main(String[] args) {Scanner in=new Scanner(System.in);while(in.hasNext()){String str=in.next();//System.out.println(midToPost(str));char[] ch=midToPost(str).toCharArray();for(int i=0;i<ch.length;i++){char c=ch[i];if(Character.isDigit(c) || c=='.'){System.out.print(c);}else if(c=='#'){System.out.print(" ");}else if(c=='!'){        System.out.print("-");      }else if(c=='@'){System.out.print("");}else{System.out.print(" "+c);}}}}}


1 0
原创粉丝点击