【資料結構演算法】如何使用棧計算字尾表示式
阿新 • • 發佈:2019-02-02
無聊寫的一個使用棧計算字尾表示式的程式碼:
初次寫,只有+-*/四個運算子,後面可以自己加,都差不多就是個算術運算子優先順序的問題。
主函式:包括初始化*+-/符號,判斷輸入的字元是運算元還是運算子。
/** * !!!!!(棧相關測試) * @author WZ * */ package MyCollection; public class Test01 { /** * 使用棧計算字尾表示式 * * @author WZ * */ class CalPostfixExpressionByStack { private static final char ADD = '+'; private static final char SUB = '-'; private static final char MUL = '*'; private static final char DEV = '/'; MyStack stack1; public CalPostfixExpressionByStack() { stack1 = new MyStack(); } public Object Scan(String expr) { int op1 = 0; int op2 = 0, result = 0; String token; Scanner scanner = new Scanner(expr); // System.out.println(scanner.next().charAt(1)); while (scanner.hasNext()) { token = scanner.next();// next()不回錄入空格 if (isOperator(token)) { // if (stack1.peek() instanceof Integer) {這裡是錯誤的,因為棧中的其他元素依然是String物件,String物件無法強轉成為Integer。 // op1=(Integer) stack1.pop(); // op2=(Integer) stack1.pop(); // } op1 = (int) stack1.pop(); op2 = (int) stack1.pop(); result = CalSingleOperator(token.charAt(0), op1, op2); stack1.push(result); } else { if (token instanceof String) { stack1.push(Integer.parseInt(token));//只要讀入的的是String物件,直接轉成Integer物件,避免後面的運算混亂 } } } return result; } public int CalSingleOperator(char operator, int op1, int op2) { int result = 0; // Integer opp1=Integer.valueOf((String) op1); // Integer opp2=Integer.valueOf((String) op2); // Number number1 = (Number) op1; // Number number2 = (Number) op2; // int opp1 = number1.intValue(); // int opp2 = number2.intValue(); switch (operator) { case ADD: result = op2 + op1; break; case SUB: result = op2 - op1; break; case MUL: result = op2 * op1; break; case DEV: result = op2 / op1; break; default: break; } return result; } public boolean isOperator(String token) { return (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")); } } public static void main(String[] args) { // TODO Auto-generated method stub // MyStack m=new MyStack(); // char c='*'; // m.push(c); // System.out.println(m.pop()); ///////////////////////////////// // String[] s1={"111","2222","333"}; Test01 t1 = new Test01(); // QueueWithTowStack queueWithTowStack=t1.new QueueWithTowStack(); // for (int i = 0; i < s1.length; i++) { // queueWithTowStack.enQueue(s1[i]); // } ////////////////////////////////// // queueWithTowStack.isEmpty(); // System.out.println(queueWithTowStack.deQueue()); // System.out.println(queueWithTowStack.deQueue()); // System.out.println(queueWithTowStack.deQueue()); /////////////////////////////////// String exression; Object result; Scanner scanner = new Scanner(System.in); CalPostfixExpressionByStack c = t1.new CalPostfixExpressionByStack(); System.out.println("請輸入一個字尾表示式:"); System.out.println("例如123*+5-"); exression = scanner.nextLine(); result = c.Scan(exression); System.out.println("結果為:" + result); } }
自己定義的Stack,有基本的功能就夠了......本人懶水平也不是很高。。。。
package MyCollection; public class MyStack { private Object[] objects; private int top; public MyStack() { this(10); } public MyStack(int maxsize) { objects=new Object[maxsize]; top=0; } public void push(Object obj) { objects[top++]=obj; } public Object pop() { return objects[--top]; } public boolean isEmpty() { return top==0; } public void disPlay() { for (int i = top-1; i >=0; i--) { System.out.println(objects[i]); } } public Object peek() { return objects[top-1]; } public int size(){ return top; } public Object[] getObjects() { return objects; } public void setObjects(Object[] objects) { this.objects = objects; } }
最後是一個輸出(哈哈哈哈火火吼吼...)
請輸入一個字尾表示式:
例如123*+5-
1 2 3 * + 5 -
結果為:2
就這麼多了。。