164.Basic Calculator II
来源:互联网 发布:windows phone qq在线 编辑:程序博客网 时间:2024/06/04 18:11
Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negative integers, +
, -
, *
, /
operators and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid.
Some examples:
"3+2*2" = 7" 3/2 " = 1" 3+5 / 2 " = 5
Note: Do not use the eval
built-in library function.
计算表达式的值。
Step1:把字符串s按照()+-进行分割成字符串数组;
Step2:新建一个stack存放目前计算的值;
Step3:依次遍历字符串数组中的每个字符串;如果遇到的是*或/则先把其左右两边操作数计算之后再入栈。
Step4:把栈内的元素进行运算。
第三步相当于去括号并且如果遇到了*和/则先把其左右操作数的计算结果得到之后再入栈,第四步计算去掉括号之后的值。
/** * 计算表达式的值。 * 题目中指出表达式中并没有括号,所以可以暂时不用考虑括号的问题。 * 只需要在遍历过程中如果遇到了*和/则先计算即可。 */public int calculate(String s) {Stack stack = new Stack<String>();ArrayList<String> list = new ArrayList<String>();int sLen = s.length();int index = 0;StringBuilder sb;/*查分字符串为数字和括号+-,比如1 + 1拆分为1,+,1*/while(index<sLen){char c = s.charAt(index);/*如果遇到的是空格,则忽略*/if(c == ' '){index++;continue;}/*如果遇到的是符号,则入list*/if(c == '+' ||c == '-' || c == '/' || c == '*'){list.add(s.substring(index,index+1));index++;}else{//如果是数字则把当前的这数字取完sb = new StringBuilder();while(index<sLen && s.charAt(index)!='+' && s.charAt(index)!='-' && s.charAt(index)!='/' && s.charAt(index)!='*'&& s.charAt(index)!=' '){sb.append(s.charAt(index));index++;}list.add(sb.toString());}}int len = list.size();/* 如果list只有一个元素说明字符串s只有一个数字,直接返回即可 */if (len == 1) {return Integer.valueOf(list.get(0));}/*第一遍相当于把表达式中间的括号都去掉,在压栈的过程中,遇到右括号则把当前最里面括号的内容计算出*/int i = 0;stack.add(list.get(0));// 先把第一个元素入栈i++;while (i < len) {String temp = list.get(i); if(temp.equals("*")){//如果遇到了*或/则先计算其结果然后入栈int left = Integer.valueOf((String) stack.pop());i++;int right = Integer.valueOf(list.get(i));stack.add(left*right+"");}else if(temp.equals("/")){int left = Integer.valueOf((String) stack.pop());i++;int right = Integer.valueOf(list.get(i));stack.add(left/right+"");}else {stack.add(temp);}i++;}/*然后计算栈内表达式的值*/EntreParentesis(stack);return Integer.valueOf((String) stack.pop());}/* * 计算栈顶的一个括号内的值,现在栈顶的若干个元素如(5-2+3+4, * 这个方法完成的工作就是通过把若干个栈顶元素(左括号之前包括左括号)弹栈计算得出10,然后把10压入栈 */private void EntreParentesis(Stack<String> stack) {int right;// 右操作数int left;// 左操作数/*把(5-2+3+4依次弹栈,然后再压入tempStack中*/Stack<String> tempStack = new Stack<String>();while (!stack.isEmpty()) {tempStack.add(stack.pop());}/*计算tempStack中表达式的值*/String val = (String) tempStack.pop();right = Integer.valueOf(val);while (!tempStack.isEmpty() ) {String oper = tempStack.pop();left = Integer.valueOf(tempStack.pop());if (oper.equals("+")) {right = left + right;} else{right = right - left;}}stack.add(right + "");}
0 0
- 164.Basic Calculator II
- Basic Calculator & Basic Calculator II
- [LeetCode] Basic Calculator II
- Basic Calculator II
- [leetcode] Basic Calculator II
- leetcode Basic Calculator II
- Basic Calculator II
- 227Basic Calculator II
- 【LeetCode】Basic Calculator II
- Basic Calculator II
- [Leetcode]Basic Calculator II
- Basic Calculator II
- LeetCode227:Basic Calculator II
- Basic Calculator II
- Basic Calculator II
- Basic Calculator II(**)
- LeetCode Basic Calculator II
- [Leetcode]Basic Calculator II
- 如何将git上的代码迁移到Coding上
- 单片机嵌入式编程的五个注意事项
- python 编程小技巧
- Android学习
- android用shape画虚线
- 164.Basic Calculator II
- 利用hdfs的java api进行文件操作注意事项
- 软件测试之sql注入漏洞
- 01背包
- 第一篇
- 文章标题
- U盘安装centos 7 提示 “Warning: /dev/root does not exist, could not boot” 解决办法
- 无刷新表单信息提交,使用HTML5新技术FormData
- 分享一款免费短信收发平台