題目:一個對於一個單行的逆波蘭表示式,由如下元素構成:
數字:十進位制數字字元構成的正整數,比如 223
運算子:支援三種運算子^+和*,分別代表自增,加法和乘法
分隔符:一個或者多個空格
例如下面的字串就是個逆波蘭表示式
2 3 4 * ^ 5 +
逆波蘭表示式在一個基於棧的虛擬機器中求解,虛擬機器的棧能儲存16個整數,虛擬機器從左向右掃描表示式,遇到整數就壓棧,遇到表示式則從棧頂彈出若干個整數進行計算,計算結果重新壓回棧中。其中運算子^從棧頂彈出一個整數,增加1之後壓棧;運算子+和*從棧頂彈出兩個整數,分別做相加和相乘運算後壓棧。如果遇到運算子的時候,棧內沒有足夠的整數,稱為下溢位,返回-1;把整數壓棧的時候,如果棧沒有足夠的空間,稱為上溢位,返回-2;如果整個計算過程中沒有發生溢位,在整個表示式求解完成後,返回棧頂的整數。
分析:其實這題,之前我是寫過的,LeetCode上面有這道題,但是當時沒有異常處理,還是小編機智,發現了這個點,一開始,我在本地測試都是對的,但是不知道為什麼每次線上測試都是通過率都是0,後來才發現沒有處理異常。好了程式碼如下:
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> inputs = new ArrayList<Integer>();
Scanner in = new Scanner(System.in);
String line = in.nextLine();
if (line != null && !line.isEmpty()) {
int res = resolve(line.trim());
System.out.println(String.valueOf(res));
}
}
public static int resolve(String expr) {
ArrayDeque<Integer> stack = new ArrayDeque<>();
String[] str = expr.split(" ");
if (str.length > 16) {
return -2;
}
for (int i = 0; i < str.length; i++) {
if (str[i].matches("\\d+$")) {
stack.push(Integer.parseInt(str[i]));
if (stack.size() > 16) {
return -2;
}
} else {
String temp = str[i];
switch (temp) {
case "^":
try {
int i1 = (int) stack.pop() + 1;
stack.push((Integer) i1);
break;
} catch (Exception e) {
return -1;
}
case "+":
try {
int right = stack.pop();
int left = stack.pop();
stack.push(right + left);
break;
} catch (Exception e) {
return -1;
}
case "*":
try {
int right1 = stack.pop();
int left1 = stack.pop();
stack.push(right1 * left1);
break;
} catch (Exception e) {
return -1;
}
}
}
}
return stack.pop();
}
}
程式碼已通過線上測試!只是個人覺得程式碼好像不是很漂亮!
最後小編依然歡迎大家評論!小編會在第一時間回覆,如果喜歡的話,歡迎訂閱哦!一起交流學習進步,畢竟頭條的讀者中程式設計大神大有人在啊!