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);
}
}
}
}
}