Leetcode | Basic Calculator
来源:互联网 发布:karunesh 知乎 编辑:程序博客网 时间:2024/06/05 03:03
question
Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .
You may assume that the given expression is always valid.
Some examples:
“1 + 1” = 2
” 2-1 + 2 ” = 3
“(1+(4+5+2)-3)+(6+8)” = 23
normal solution
没有优化 像利用栈进行四则运算的普通算法一样解决 效率其低
就是比较运算符的优先级 若在栈中的字符比要入栈的字符优先级高
将其提前出来 进行运算 循环
public String [][]priority = { {">",">","=",">"}, {">",">","=",">"}, {"=","=","=","#"}, {"<","<","#"}};public int getIndex(String s){ switch (s) { case"+": return 0; case"-": return 1; case"(": return 2; case")": return 3; } return 0;}public String cmp(String s1,String s2){ return priority[getIndex(s1)][getIndex(s2)];}public int calculate(String s) { Stack<String> numbers = new Stack<String>(); Stack<String> signs = new Stack<String>(); int i=0; int l=0; int len=s.length(); char ch; while(i < len) { ch=s.charAt(i); //System.out.println("l i: "+l+" "+i); if(Character.isDigit(ch)) { while(Character.isDigit(ch)) { i++; if(i>=len) break; ch=s.charAt(i); } if(i>l && i<=len) { String n=s.substring(l,i); numbers.push(n); System.out.println("number: "+n); } continue; }else{ if(ch!=' ') { if(signs.isEmpty()) { signs.push(ch+""); System.out.println("sign: "+ch); }else{ String top=signs.peek(); String cmpRe=cmp(top,ch+""); if(cmpRe.equals(">")) { int n1=0,n2=0; System.out.println("pop: "+numbers.peek()); n2= Integer.valueOf(numbers.pop()); //System.out.println("pop: "+numbers.peek()); if(!numbers.isEmpty()) n1= Integer.valueOf(numbers.pop()); System.out.println("pop: "+signs.peek()); String op=signs.pop(); if(op.equals("+")) { numbers.push((n1+n2)+""); }else{ numbers.push((n1-n2)+""); } System.out.println("number: "+numbers.peek()); continue; }else if(cmpRe.equals("#")) { System.out.println("pop: "+signs.peek()); signs.pop(); }else{ signs.push(ch+""); System.out.println("sign: "+ch); } } } l=i+1; } i++; } while(!signs.isEmpty()) { int n1=0,n2=0; System.out.println("pop: "+numbers.peek()); n2= Integer.valueOf(numbers.pop()); //System.out.println("pop: "+numbers.peek()); if(!numbers.isEmpty()) n1= Integer.valueOf(numbers.pop()); System.out.println("pop: "+signs.peek()); String op=signs.pop(); if(op.equals("+")) { numbers.push((n1+n2)+""); }else{ numbers.push((n1-n2)+""); } } return Integer.valueOf(numbers.pop());}
excellent solution
一个运算符后必然有一个数字 用sign保存符号的(1 代表加号 0 代表减号) 用result变量保存每次运算的结果 遇到“(”时将符号位和数字入栈 因为遇到“(”时必然至多一个符号位和一个结果 遇到“)” 将遇到“(”时入栈的结果出栈 并将结果保存在result 最后的结果就是result。
真是excellent的解法
public static int calculate(String s) {int len = s.length(), sign = 1, result = 0;Stack<Integer> stack = new Stack<Integer>();for (int i = 0; i < len; i++) { if (Character.isDigit(s.charAt(i))) { int sum = s.charAt(i) - '0'; while (i + 1 < len && Character.isDigit(s.charAt(i + 1))) { sum = sum * 10 + s.charAt(i + 1) - '0'; i++; } result += sum * sign; } else if (s.charAt(i) == '+') sign = 1; else if (s.charAt(i) == '-') sign = -1; else if (s.charAt(i) == '(') { stack.push(result); stack.push(sign); result = 0; sign = 1; } else if (s.charAt(i) == ')') { result = result * stack.pop() + stack.pop(); }}return result;
}
0 0
- 【LeetCode】Basic Calculator && Basic Calculator II
- LeetCode - Basic Calculator & Basic Calculator II
- Leetcode之Basic Calculator & Basic Calculator II
- [leetcode] Basic Calculator
- Basic Calculator - LeetCode 224
- LeetCode Basic Calculator
- leetcode:Basic Calculator
- [leetcode][math] Basic Calculator
- [LeetCode] Basic Calculator
- Leetcode 224: Basic Calculator
- leetcode 224 Basic Calculator
- [LeetCode] Basic Calculator II
- [leetcode] Basic Calculator II
- [Leetcode] Basic Calculator
- leetcode Basic Calculator
- leetcode Basic Calculator II
- LeetCode-Basic Calculator
- leetcode Basic Calculator 栈
- R语言:lengths计算列表list中元素的个数
- SSL 2521 数数
- 关于泛型程序设计和c++标准模板库
- JavaSE学习(10) 集合框架
- 116. Populating Next Right Pointers in Each Node
- Leetcode | Basic Calculator
- 349. Intersection of Two Arrays#2(Done)
- java学习入门
- 【PHP】10个值得深思的PHP面试问题
- Mac VMWare Fusion安装ghost win7注意事项
- Java程序员应当知道的10个面向对象设计原则
- Windows程序设计(1):Hello,world!
- 文章标题
- 郝斌的C语言基础 155 如何取出结构体中的每一个成员