- 要求: 輸入一個逆波蘭表達式(后綴表達式),使用棧計算結果
- 這里簡化,這對整數進行計算
思路分析
- 例如:(3+4)x5-6 對應的后綴表達式就是3 4 + 5 x 6 -,針對后綴表達式求值步驟如下:
- 從左至右掃描,將3和4壓入棧中;
- 遇到+運算符,因此彈出4和3(4為棧頂元素,3為次頂元素),計算出3+4的值7,再將7入棧;
- 繼續掃描,將5入棧;
- 接下來就是x運算符,因此彈出5和7,計算7x5 = 35,將35入棧
- 將6入棧;
- 最后是 - 運算符,計算35-6 = 29的值.
代碼實現
public class PolandNotation {
public static void main(String[] args) {
String suffixExpression = "30 4 + 5 * 6 -";
//將后綴表達式保存到ArrayList中
List<String> list = getListString(suffixExpression);
//初始化一個棧
Stack<String> stack = new Stack<>();
//遍歷后綴表達式數組
for (String s : list) {
if (s.matches("\\d+")){
stack.push(s);
}else {
//出站兩個元素
int num1 = Integer.parseInt(stack.pop());
int num2 = Integer.parseInt(stack.pop());
//計算兩個數
int res = calculate(num1,num2,s);
//將返回值壓棧
stack.push(""+res);
}
}
System.out.printf("計算結果為:%d\n",Integer.parseInt(stack.pop()));
}
/**
*
* @param num1 先出棧的數
* @param num2 后出棧的數
* @param s 操作符
* @return 但會兩個數運算后的結果
*/
private static int calculate(int num1, int num2, String s) {
int res = 0;
switch (s){
case "+":
res = num2 + num1;
break;
case "-":
res = num2 - num1;
break;
case "*":
res = num2 * num1;
break;
case "/":
res = num2 / num1;
break;
default:
break;
}
return res;
}
/**
*
* @param suffixExpression 后綴表達式
* @return 返回轉換后的list數組
*/
private static List<String> getListString(String suffixExpression) {
List<String> list = new ArrayList<>();
String[] s = suffixExpression.split(" ");
for (String s1 : s) {
list.add(s1);
}
return list;
}
}