package chapter4;
import java.util.Scanner;
public class Infix {
/**
* @将中缀表达式转化为后缀表达式,为表达式求值做准备
* (A+B)*C-D/(E+F)
* AB+C*DEF+/-
*/
public static void main(String[] args) {
while(true){
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
if(input=="")
break;
InToPost thePost = new InToPost(input);
String output = thePost.doTrans();
System.out.println("output: "+output);
}
}
}
class StackA{
private int maxSize;
private char[] stackArray;
private int top;
public StackA(int max){
maxSize = max;
stackArray = new char[maxSize];
top=-1;
}
public void push(char value){
stackArray[++top] = value;
}
public char pop(){
return stackArray[top--];
}
public char peek(){
return stackArray[top];
}
public boolean isEmpty(){
return top==-1;
}
public int size(){
return top+1;
}
public char peekN(int n){
return stackArray[n];
}
public void displayStack(String s){
System.out.println(s);
System.out.println("display stack from bottom-->top:");
for(int i=0;i<size();i++){
System.out.print(peekN(i)+" ");
}
System.out.println();
}
}
class InToPost{
private String input;
private String output;
private StackA theStack;
public InToPost(String in){
input = in;
output = "";
theStack = new StackA(input.length());
}
public String doTrans(){
for(int i=0;i<input.length();i++){
char ch = input.charAt(i);
System.out.println("push "+ch+" to stack");
//theStack.displayStack("For "+ch+" ");
switch(ch){
case '+':
case '-':
gotOper(ch,1);
break;
case '*':
case '/':
gotOper(ch,2);
break;
case '(':
theStack.push(ch);
break;
case ')':
gotParen(ch);
break;
default:
output = output+ch;
break;
}
}
while(!theStack.isEmpty()){
char temp = theStack.pop();
output = output+temp;
}
return output;
}
public void gotOper(char opThis,int pre1){
while(!theStack.isEmpty()){
char opTop = theStack.pop();
if(opTop=='('){
theStack.push(opTop);
break;
}
else{
int pre2;
if(opTop=='+' || opTop=='-')
pre2 = 1;
else
pre2 = 2;
if(pre2<pre1){
theStack.push(opTop);
break;
}
else
output = output+opTop;
}
}
theStack.push(opThis);
}
public void gotParen(char opThis){
while(!theStack.isEmpty()){
char opTop = theStack.pop();
if(opTop=='(')
break;
else
output = output+opTop;
}
}
}