android计算器括号,计算器(一)——加减和括号
題目分析:
只有加減法,所以運算符之間是沒有優先級的,只需解決括號帶來的優先級問題。
可以有兩個方案:遞歸,棧。
解法一:遞歸
/**
* 解題簡語:
* 遞歸也可以用來達到棧的功能 -- 后進先出,妙不可言
* 但是平衡括號部分有重復遍歷 慢
*/
public static int calculate(String s) {
int res = 0, num = 0, sign = 1, n = s.length();
for (int i = 0; i < n; ++i) {
char c = s.charAt(i);
if (c >= '0') {
num = 10 * num + (c - '0');
} else if (c == '(') {
int j = i, cnt = 0;
for (; i < n; ++i) {
if (s.charAt(i) == '(') ++cnt;
if (s.charAt(i) == ')') --cnt;
if (cnt == 0) break;
}
num = calculate(s.substring(j + 1, i));
}
if (c == '+' || c == '-' || i == n - 1) {
res += sign * num;
num = 0;
sign = (c == '+') ? 1 : -1;
}
}
return res;
}
解法二:棧
/**
* 解題簡語:
* 1.從左到右挨個計算 用一個res累計當前結果
* 2.用一個sign來區分加減
* 3.遇到"("將之前結果壓棧
* 遇到")"彈棧 -- 壓棧時同時壓入sign
* PS:1.res = 0和 sign = 1 其實相當于是表達式前方加了個 "0+"
* 2.
* '0' == 48
* '空格' == 32
* '+' == 43
* '-' == 45
* '*' == 42
* '/' == 47
* 且題目只空格數字運算符
* 所以 c >= '0' c就是數字字符
*/
public static int calculate(String s) {
int res = 0, num = 0, sign = 1, n = s.length();
Stack st = new Stack<>();
for (int i = 0; i < n; ++i) {
char c = s.charAt(i);
if (c >= '0') {
num = 10 * num + (c - '0');
} else if (c == '+' || c == '-') {
res += sign * num;
num = 0;
sign = (c == '+') ? 1 : -1;
} else if (c == '(') {
st.push(res);
st.push(sign);
res = 0;
sign = 1;
} else if (c == ')') {
res += sign * num;
num = 0;
res *= st.pop();
res += st.pop();
}
}
res += sign * num;
return res;
}
總結
以上是生活随笔為你收集整理的android计算器括号,计算器(一)——加减和括号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux vi 进去命令模式,Linu
- 下一篇: epoll边缘触发_C++回声服务器_9