在看《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方法,這個困擾了很長時間。
另一個問題就是,字符串的讀取問題,依然不太熟練,耽誤了較長時間。