网站目录模板,免费的app软件大全,找哪些公司做网站,网站建设 青岛题目描述#xff1a; 给你一个字符串表达式 s #xff0c;请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意#xff1a;不允许使用任何将字符串作为数学表达式计… 题目描述 给你一个字符串表达式 s 请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意不允许使用任何将字符串作为数学表达式计算的内置函数比如 eval() 。 解题思路 使用栈数字栈 思路* / 直接算 - 后面再算最后只剩 -再while(!numStack.isEmpty){计算加减就行} 1.1 遍历字符串是数字直接放到数字栈 1.2 若遇到字符若是 * /则从栈中弹出一个num进行计算 若是 则直接压入栈中 若是 -则变成相反数再直接压入栈中 1.3 最后遍历数字栈将所有数字求和即为表达式的结果 import java.util.Stack;/*** author: Arbicoral* Description: 输入字符串 “32*2”求结果。*/
public class KuaiShou {public static void main(String[] args) {String s 3323*2-33-53/5;System.out.println(s calculate1(s));System.out.println(s calculate2(s));}/*** 使用栈数字栈* 思路* / 直接算 - 后面再算最后只剩 -再while(!numStack.isEmpty){计算加减就行}* 1.1 遍历字符串是数字直接放到数字栈* 1.2 若遇到字符若是 * /则从栈中弹出一个num进行计算若是 则直接压入栈中若是 -则变成相反数再直接压入栈中* 1.3 最后遍历数字栈将所有数字求和即为表达式的结果* return 表达式的结果*/public static int calculate2(String expression) {int num 0;int len expression.length();StackInteger numStack new Stack();// 数字栈char operator ;// 要放到循环的外面如果放到里面则每次的操作符都是 而我们只需要第一次是 即可后面都要不断更新的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 外面不然每读取表达式中的一个字符num 和 operator都会变而我们只需要operator不是数字num 0;operator c;}}// 出 for()此时栈中只剩下 -操作int res 0;while (!numStack.isEmpty()){res numStack.pop();}return res;}/*** 思路将字符串中的操作符全部变成 即遇到 - 的则再取一个然后变成对应的负数遇到 * / 就直接计算最后将栈中的所有数相加即可*/public static int calculate1(String expression) {StackInteger 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;}
}