利用棧結構生成字尾表示式
阿新 • • 發佈:2019-01-08
利用棧結構來構建字尾表示式
關於字尾表示式,推薦部落格http://blog.csdn.net/antineutrino/article/details/6763722/
部落格中詳細介紹了表示式的生成過程。這裡作簡要介紹。
字尾表示式的生成準則:
利用該準則轉換A*(B+C)
利用該準則轉換A+B*C
利用該準則轉換A+B-C
有了這個準則,我們就可以設計一個棧來實現字尾表示式的轉換。
// infix.java // converts infix arithmetic expressions to postfix // to run this program: C>java InfixApp import java.io.*; // for I/O //////////////////////////////////////////////////////////////// class StackX//定義棧結構 { private int maxSize; private char[] stackArray; private int top; //-------------------------------------------------------------- public StackX(int s) // constructor { maxSize = s; stackArray = new char[maxSize]; top = -1; } //-------------------------------------------------------------- public void push(char j) // put item on top of stack { stackArray[++top] = j; } //-------------------------------------------------------------- public char pop() // take item from top of stack { return stackArray[top--]; } //-------------------------------------------------------------- public char peek() // peek at top of stack { return stackArray[top]; } //-------------------------------------------------------------- public boolean isEmpty() // true if stack is empty { return (top == -1); } //------------------------------------------------------------- public int size() // return size { return top+1; } //-------------------------------------------------------------- public char peekN(int n) // return item at index n { return stackArray[n]; } //-------------------------------------------------------------- public void displayStack(String s)//顯示棧內容 { System.out.print(s); System.out.print("Stack (bottom-->top): "); for(int j=0; j<size(); j++) { System.out.print( peekN(j) ); System.out.print(' '); } System.out.println(""); } //-------------------------------------------------------------- } // end class StackX //////////////////////////////////////////////////////////////// class InToPost // 定義字尾表示式轉換準則 { private StackX theStack; private String input; private String output = ""; //-------------------------------------------------------------- public InToPost(String in) // constructor { input = in; int stackSize = input.length(); theStack = new StackX(stackSize); } //-------------------------------------------------------------- public String doTrans() // do translation to postfix { for(int j=0; j<input.length(); j++) // for each char { char ch = input.charAt(j); // 獲得input對應的字元陣列中下標為j的字元值 theStack.displayStack("For "+ch+" "); // *diagnostic* switch(ch) { case '+': // it's + or - case '-': gotOper(ch, 1); // 第二個引數“1”表示+和-的優先順序為1 break; // (precedence 1) case '*': // it's * or / case '/': gotOper(ch, 2); //第二個引數“2”表示*和/的優先順序為2 break; // (precedence 2) case '(': // it's a left paren theStack.push(ch); // push it break; case ')': // it's a right paren gotParen(ch); // go pop operators break; default: // must be an operand output = output + ch; // 如果是數字而不是操作符,不入棧直接輸出 break; } // end switch } // end for while( !theStack.isEmpty() ) // pop remaining opers { theStack.displayStack("While "); // *diagnostic* output = output + theStack.pop(); // write to output } theStack.displayStack("End "); // *diagnostic* return output; // return postfix } // end doTrans() //-------------------------------------------------------------- public void gotOper(char opThis, int prec1)//處理加減乘除操作符 { // got operator from input while( !theStack.isEmpty() ) { char opTop = theStack.pop(); if( opTop == '(' ) // if it's a '(' { theStack.push(opTop); // restore '(' break; } else // it's an operator { int prec2; // precedence of new op if(opTop=='+' || opTop=='-') // find new op prec prec2 = 1; else prec2 = 2; if(prec2 < prec1) // if prec of new op less { // than prec of old theStack.push(opTop); // save newly-popped op break; } else // prec of new not less output = output + opTop; // than prec of old } // end else (it's an operator) } // end while theStack.push(opThis); // push new operator } // end gotOp() //-------------------------------------------------------------- public void gotParen(char ch)//處理“)” { // got right paren from input while( !theStack.isEmpty() ) { char chx = theStack.pop(); if( chx == '(' ) // if popped '(' break; // we're done else // if popped operator output = output + chx; // output it } // end while } // end popOps() //-------------------------------------------------------------- } // end class InToPost //////////////////////////////////////////////////////////////// class InfixApp { public static void main(String[] args) throws IOException { String input, output; while(true) { System.out.print("Enter infix: "); System.out.flush(); input = getString(); // read a string from kbd if( input.equals("") ) // quit if [Enter] break; // make a translator InToPost theTrans = new InToPost(input); output = theTrans.doTrans(); // do the translation System.out.println("Postfix is " + output + '\n'); } // end while } // end main() //-------------------------------------------------------------- public static String getString() throws IOException { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s = br.readLine(); return s; } //-------------------------------------------------------------- } // end class InfixApp ////////////////////////////////////////////////////////////////