用2個棧實現數學運算

在看《Algorithm》這本書時看到一個算法,可以很巧妙地實現對一個式子(字符串)實現運算,例如輸入((1 + 2)* ( 1 / 2 ) ) =, 可以得到1.5.

其基本原理是:
1.構建2個棧,一個用於存儲數字,一個用於存儲操作符。
2.從左到右掃描字符串中的元素,直到掃描結束:
獲得一個子串:
(1)若爲數字,存入數字棧;
(2)若爲操作符,存入操作符棧;
(3)若爲左括號,不作任何操作,繼續掃描;
(4)若爲右括號,從數字棧連續兩次彈出a1, a2;從操作符棧彈出操作符op,將結果a2 op a1結果存入數字棧
具體Java代碼如下:

import java.util.Stack;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class DoubleStackCompute {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Stack<Double> numbers = new Stack<Double>();
        Stack<String> op = new Stack<String>();

        //判斷每個字符,數字壓入數字棧,操作符壓入操作符棧
        String str;
        while (!(str = StdIn.readString()).equals("=")) {

            if (str.equals("(")) 
                continue;
            else if (str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/")) 
                op.push(str);
            else if (str.equals(")")) {
                double num2 = numbers.pop();
                double num1 = numbers.pop();
                String c = op.pop();
                double result;
                if      (c.equals("+")) result = num1 + num2;
                else if (c.equals("-")) result = num1 - num2;
                else if (c.equals("*")) result = num1 * num2;
                else if (c.equals("/")) result = num1 / num2;
                else                    continue;
                numbers.push(result);
            }
            else {
                numbers.push(Double.parseDouble(str));
            }
        }
        StdOut.print(numbers.pop());
    }
}

在編程過程中,主要遇到的問題是,兩個字符串的比較直接用了“==”判斷符,但是實際上應該用到String 類的equals方法,這個困擾了很長時間。
另一個問題就是,字符串的讀取問題,依然不太熟練,耽誤了較長時間。

發佈了39 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章