國(guó)外網(wǎng)購(gòu)網(wǎng)站十大排名seo站長(zhǎng)常用工具
題目描述:
給你一個(gè)字符串表達(dá)式 s ,請(qǐng)你實(shí)現(xiàn)一個(gè)基本計(jì)算器來(lái)計(jì)算并返回它的值。
整數(shù)除法僅保留整數(shù)部分。
你可以假設(shè)給定的表達(dá)式總是有效的。所有中間結(jié)果將在 [-231, 231 - 1] 的范圍內(nèi)。
注意:不允許使用任何將字符串作為數(shù)學(xué)表達(dá)式計(jì)算的內(nèi)置函數(shù),比如 eval() 。
解題思路:
使用棧:數(shù)字棧
思路:* / 直接算,+ - 后面再算,最后只剩 + -,再while(!numStack.isEmpty){計(jì)算加減就行}
1.1 遍歷字符串,是數(shù)字直接放到數(shù)字棧
1.2 若遇到字符,若是 * /,則從棧中彈出一個(gè)num進(jìn)行計(jì)算
若是 +,則直接壓入棧中
若是 -,則變成相反數(shù)再直接壓入棧中
1.3 最后遍歷數(shù)字棧,將所有數(shù)字求和即為表達(dá)式的結(jié)果
import java.util.Stack;/*** @author: Arbicoral* @Description: 輸入字符串 “3+2*2”,求結(jié)果。*/
public class KuaiShou {public static void main(String[] args) {String s = "33+23*2-33-53/5";System.out.println(s + " = " + calculate1(s));System.out.println(s + " = " + calculate2(s));}/*** 使用棧:數(shù)字棧* 思路:* / 直接算,+ - 后面再算,最后只剩 + -,再while(!numStack.isEmpty){計(jì)算加減就行}* 1.1 遍歷字符串,是數(shù)字直接放到數(shù)字棧* 1.2 若遇到字符,若是 * /,則從棧中彈出一個(gè)num進(jìn)行計(jì)算若是 +,則直接壓入棧中若是 -,則變成相反數(shù)再直接壓入棧中* 1.3 最后遍歷數(shù)字棧,將所有數(shù)字求和即為表達(dá)式的結(jié)果* @return 表達(dá)式的結(jié)果*/public static int calculate2(String expression) {int num = 0;int len = expression.length();Stack<Integer> numStack = new Stack<>();// 數(shù)字棧char operator = '+';// 要放到循環(huán)的外面,如果放到里面則每次的操作符都是 '+',而我們只需要第一次是 + 即可,后面都要不斷更新的for (int i = 0; i <= len - 1; i++) {char c = expression.charAt(i);if (Character.isDigit(c)){num = num * 10 + (c - '0');}if (!Character.isDigit(c) && c != ' ' || i == len-1){switch (operator) {case '+' -> numStack.push(num);case '-' -> numStack.push(-num);case '*' -> numStack.push(numStack.pop() * num);case '/' -> numStack.push(numStack.pop() / num);}// 重置 num 和 操作符; 注意:不能放到 if 外面,不然每讀取表達(dá)式中的一個(gè)字符num 和 operator都會(huì)變,而我們只需要operator不是數(shù)字num = 0;operator = c;}}// 出 for()此時(shí)棧中只剩下 + -操作int res = 0;while (!numStack.isEmpty()){res += numStack.pop();}return res;}/*** 思路:將字符串中的操作符全部變成 + ,即遇到 - 的則再取一個(gè),然后變成對(duì)應(yīng)的負(fù)數(shù),遇到 * / 就直接計(jì)算,最后將棧中的所有數(shù)相加即可*/public static int calculate1(String expression) {Stack<Integer> stack = new Stack<>();int num = 0;char operation = '+';for (int i = 0; i < expression.length(); i++) {char c = expression.charAt(i);if (Character.isDigit(c)) {num = num * 10 + (c - '0');}if (!Character.isDigit(c) && c != ' ' || i == expression.length() - 1) {if (operation == '+') {stack.push(num);} else if (operation == '-') {stack.push(-num);} else if (operation == '*') {stack.push(stack.pop() * num);} else if (operation == '/') {stack.push(stack.pop() / num);}num = 0;operation = c;}}int result = 0;while (!stack.isEmpty()) {result += stack.pop();}return result;}
}