一、前綴表達式【波蘭表達式】:
- 前綴表達式也稱為波蘭表達式,其特點是運算符位于操作數之前
- 舉例說明:(3+4)*5-6 對應的前綴表達式就是:- * + 3 4 5 6
前綴表達式的計算機求值:
從右至左掃描表達式,遇到數字時,將數字壓入堆棧中,遇到運算符,彈出來棧頂的2個數,用運算符對他們做相應的運算(棧頂元素和次頂元素),并將結果入棧,重復上述過程直到表達式最左端,最后運算得出的值即為表達式的值,例如(3+4)*5-6 對應的前綴表達式就是:- * + 3 4 5 6,針對前綴表達式求值步驟如下:
- 從右至左掃描,將6、5、4、3壓入堆棧
- 遇到 + 運算符,因此彈出3(棧頂元素)、4(次頂元素),計算出3+4=7,將7入棧
- 接下來是 * 運算符,因此彈出7和5,計算出7*5=35,將35入棧
- 最后是 - 運算符,計算出 35 - 6 = 29【先彈出來的 - 后彈出來的】,將29入棧
二、中綴表達式:
- 中綴表達式就是我們常見的表達式:如(3+4)*5-6
- 中綴表達式的求值是我們最熟悉的,但是對于計算機來說并不好操作,因此,在計算結果時,往往會將中綴表達式轉成其它表達式來操作【一般轉成后綴表達式】
三、后綴表達式:
- 后綴表達式又稱為逆波蘭表達式,與前綴表達式相似,知識運算符位于操作數之后
- 舉例說明:(3+4)*5-6 對應的后綴表達式就是:3 4 + 5 * 6 -
后綴表達式計算機求值:
從左至右掃描表達式,遇到數字時,將數字壓入棧中,遇到運算符時,彈出棧頂的2個數(棧頂和次頂元素),用運算符將其運算,將其結果壓入到棧中,重復上述過程直到表達式的最右端,最后運算出的值即為表達式的值,例如(3+4)*5-6 對應的后綴表達式就是:3 4 + 5 * 6 -,針對其后綴表達式求值的步驟如下:
- 從左至右掃描,依次將3、4壓入到棧中
- 遇到 + 號,彈出4、3,計算3+4=7,將7壓入棧中
- 將5壓入到棧中
- 遇到 * 號,彈出5、7,計算5*7=35,將35壓入棧中
- 將6壓入棧中
- 最后遇到 - 號,彈出6、35,計算35-6=29,將29壓入棧中即為表達式的最終結果
案例:完成逆波蘭表達式,要求完成如下任務:
- 輸入一個逆波蘭表達式,使用棧(Stack)計算其結果
- 支持小括號和多位數整數,【由于此處講解的是數據結構,因此對計算器進行簡化,只支持對整數的計算】
1 import java.util.ArrayList;
2 import java.util.List;
3 import java.util.Stack;
4
5 //逆波蘭表達式的計算
6 public class NiPolandExpression {
7
8 public static void main(String[] args) {
9 //String expression = "3 4 + 5 * 6 -"; //29
10 //String expression = "30 4 + 5 * 6 -"; //164
11 //中綴:4 * 5 - 8 + 60 + 8 / 2 ==>后綴:4 5 * 8 - 60 + 8 2 / +
12 String expression = "4 5 * 8 - 60 + 8 2 / +"; //76
13 //1、將表達式轉成ArrayList集合,后遍歷,每遍歷一個元素將壓棧
14 Stack<String> stack = new Stack<>();
15 List<String> lists = getList(expression);
16 System.out.println(lists);
17 for(String ele: lists) {
18 if (ele.matches("\\d+")) { //正則表達式:表示匹配一個或者多個整數
19 //是數字直接入棧
20 stack.push(ele);
21 }else {
22 //到了這里說明是符號,需要pop出2個操作數
23 int num2 = Integer.parseInt(stack.pop());
24 int num1 = Integer.parseInt(stack.pop());
25 int ret = 0;
26 switch(ele) {
27 case "+":
28 ret = num1 + num2;
29 break;
30 case "-":
31 ret = num1 - num2;
32 break;
33 case "*":
34 ret = num1 * num2;
35 break;
36 case "/":
37 ret = num1 / num2;
38 break;
39 }
40 //將計算結果壓入棧中
41 stack.push(ret+"");
42 }
43 }
44 int result = Integer.parseInt(stack.pop());
45 System.out.println(expression + "最終結果為:" + result);
46 }
47
48 public static List<String> getList(String expression){
49 java.util.List<String> lists = new ArrayList<>();
50 String[] arrays = expression.split(" ");
51 for(String ele:arrays) {
52 lists.add(ele);
53 }
54 return lists;
55 }
56
57 }