由于在線筆試過(guò)程中,不能切出瀏覽器窗口阵翎,就沒(méi)有采用本地 IDE 編程院领,直接在線徒手寫.....
后來(lái)考試結(jié)束后,在本地 IDE 運(yùn)行了一下,結(jié)果基本正確浴麻,放下來(lái)和大家分享一下.....(我也是試試水去的得问,見(jiàn)識(shí)到阿里的牛逼了,選擇題基本不會(huì)寫软免,就把兩個(gè)編程題水了一下宫纬,這題是復(fù)制在剪切板上弄出來(lái)的)
blog.luyunfeng.cn
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*一個(gè)對(duì)于一個(gè)單行的逆波蘭表達(dá)式,由如下元素構(gòu)成:
數(shù)字:十進(jìn)制數(shù)字字符構(gòu)成的正整數(shù)膏萧,比如 223
運(yùn)算符:支持三種運(yùn)算符^+和*漓骚,分別代表自增,加法和乘法
分隔符:一個(gè)或者多個(gè)空格
例如下面的字符串就是個(gè)逆波蘭表達(dá)式
2 3 4 * ^ 5 +
逆波蘭表達(dá)式在一個(gè)基于棧的虛擬機(jī)中求解榛泛,
虛擬機(jī)的棧能保存16個(gè)整數(shù)蝌蹂,虛擬機(jī)從左向右掃描表達(dá)式,
遇到整數(shù)就壓棧挟鸠,遇到表達(dá)式則從棧頂彈出若干個(gè)整數(shù)進(jìn)行計(jì)算叉信,
計(jì)算結(jié)果重新壓回棧中。其中運(yùn)算符^從棧頂彈出一個(gè)整數(shù)艘希,增加1之后壓棧硼身;
運(yùn)算符+和*從棧頂彈出兩個(gè)整數(shù),分別做相加和相乘運(yùn)算后壓棧覆享。
如果遇到運(yùn)算符的時(shí)候佳遂,棧內(nèi)沒(méi)有足夠的整數(shù),稱為下溢出撒顿,返回-1丑罪;
把整數(shù)壓棧的時(shí)候,如果棧沒(méi)有足夠的空間,稱為上溢出吩屹,返回-2跪另;
如果整個(gè)計(jì)算過(guò)程中沒(méi)有發(fā)生溢出,在整個(gè)表達(dá)式求解完成后煤搜,返回棧頂?shù)恼麛?shù)免绿。
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String line = in.nextLine();
if (line != null && !line.isEmpty()) {
int res = resolve(line.trim());
//打印出結(jié)果
System.out.println(String.valueOf(res));
}
}
// 計(jì)算 放入棧前 檢查是否上溢出,出棧的時(shí)候檢查是否下溢出
public static int resolve(String expr) {
ArrayList<String> inputs = func(expr);
MyStack m = new MyStack();//生成逆波蘭表達(dá)式的棧
for (String s : inputs) {
if (s.matches("\\d+")) {
if (m.size() > 16) {
//上溢出
return -2;
} else {
m.push(s);
}
} else if (s.equals("^")) {
//下溢出
if (m.size() == 0) {
return -1;
} else {
int a = Integer.parseInt(m.pop());
a++;
m.push("" + a);
}
} else {
if (m.size() < 2) {
//下溢出
return -1;
} else {
int b = Integer.parseInt(m.pop());
int a = Integer.parseInt(m.pop());
if (s.equals("+")) {
a = a + b;
} else if (s.equals("*")) {
a = a * b;
}
m.push("" + a);
}
}
}
return Integer.parseInt(m.pop());
}
// 處理一下輸入擦盾,將每個(gè)字符都放入數(shù)組中嘲驾,
public static ArrayList<String> func(String expr) {
ArrayList<String> inputs = new ArrayList<String>();
String[] sa = expr.split(" ");
for (int i = 0; i < sa.length; i++) {
if (sa[i].equals("")) {
continue;
} else {
inputs.add(sa[i]);
}
}
return inputs;
}
}
//自定義棧
class MyStack {
private List<String> list;
private int size;
public String top;
public MyStack() {
list = new ArrayList<String>();
size = 0;
top = null;
}
public int size() {
return size;
}
public void push(String s) {
list.add(s);
top = s;
size++;
}
public String pop() {
String s = list.get(size - 1);
list.remove(size - 1);
size--;
top = size == 0 ? null : list.get(size - 1);
return s;
}
}