逆波蘭表達式求值(棧)
逆波蘭表示法是一種将運算符(operator)寫在操作數(operand)後面的描述程式(算式)的方法。舉個例子,我們平常用中綴表示法描述的算式(1 + 2)*(5 + 4),改為逆波蘭表示法之後則是1 2 + 5 4 + *。相較于中綴表示法,逆波蘭表示法的優勢在于不需要括号。
請輸出以逆波蘭表示法輸入的算式的計算結果。
輸入格式:
在一行中輸入1個算式。相鄰的符号(操作數或運算符)用1個空格隔開。
輸出格式:
在一行中輸出計算結果。
限制:
2≤算式中操作數的總數≤100
1≤算式中運算符的總數≤99
運算符僅包括“+”、“-”、“*”,操作數、計算過程中的值以及最終的計算結果均在int範圍内。
輸入樣例1:
4 3 + 2 -
輸出樣例1:
5
輸入樣例2:
1 2 + 3 4 - *
輸出樣例2:
-3
代碼如下:
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s=input.nextLine();
String[] a=s.split(" "); //将輸入的這行資料以空格分割,并存到數組a中
Stack<Integer> intstack = new Stack<>(); //用于裝資料中的整數
for (int i=0;i<a.length;i++){
if (judge(a[i])){ //判斷是否為整數,如果是則加到棧中
intstack.push(Integer.parseInt(a[i]));
}else { //如果不是整數,即周遊到運算符則開始運算
int right=intstack.pop();
int left=intstack.pop();
switch (a[i]){
case "+": {
int sum = right+left;
intstack.push(sum);
break;
}
case "-": {
int sum = left-right;
intstack.push(sum);
break;
}
case "*": {
int sum = left*right;
intstack.push(sum);
break;
}
case "/": {
int sum = left/right;
intstack.push(sum);
break;
}
}
}
}
System.out.println(intstack.peek()); //輸出棧頂元素,即最後的運算結果
}
static boolean judge(String s){ //用于判斷所輸入的值是否為數字,數字則輸出true,否則傳回false
try {
int num=Integer.valueOf(s);
return true;
}catch (Exception e){
return false;
}
}
}
其實逆波蘭系數求值簡單來講就是每當周遊到運算符就将此運算符左邊的兩個數字彈出做四則運 算,然後把運算後的結果值放回棧中,最後彈出棧頂元素~