算法通关村第四关-黄金挑战基础计算器问题

大家好我是苏麟 , 今天带来栈的比较难的问题 .

计算器问题

基础计算器

描述 :

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

  • s 由数字、'+''-''('')'、和 ' ' 组成
  • s 表示一个有效的表达式
  • '+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)
  • '-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
  • 输入中不存在两个连续的操作符
  • 每个数字和运行的计算将适合于一个有符号的 32位 整数

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

题目 :

LeetCode 224.基本计算器 : 

224. 基本计算器

算法通关村第四关-黄金挑战基础计算器问题_第1张图片

分析 : 

计算器也是非常常见的问题,解决运算器问题,最好的工具就是栈。我们需要两个变量来记录符号和运算后的值 , 因为题目中只有 + - ( ) 和空格 , 所以我们遇到空格就跳过 , 遇到就把符号位变为1 , 遇到减号就把符号位变为 -1 , 遇到 ( 就把计算的值和符号放到栈里 , 遇到 ) 就把栈中的值和符号取出来和当前的数字相加 , 遇到数字就进行操作 ... ... 

当然这里说可能不太好理解 , 下面有个视频大家可以更好的理解这个思路 .

视频连接 : 基础计算器

解析 :

这个代码写的不是很华丽 , 但是是这个意思 ...

//LeetCode
class Solution {
    public int calculate(String s) {

    //0 + (1+(4+5+2)-3)+(6+8)

    Stack stack = new Stack<>();
    int nums = 0;
    int flag = 1;
    int temp = 0;

    int n = 0;
    while( n < s.length()){
        char c = s.charAt(n);
        int d = c - '0';
        if(c == ' '){
            n++;
        }else if(c == '+'){
            flag = 1;
            n++;
        }else if(c == '-'){
            flag = -1;
            n++;
        }else if(c == '('){
            stack.push(nums);
            stack.push(flag);
            nums = 0;
            flag = 1;
            n++;
        }else if(c == ')'){
            int preFlag = stack.pop();
            int preNums = stack.pop();
            nums = nums * preFlag + preNums;
            n++;
        }else{
            temp = c - '0';
            n++;
            while(n < s.length() && s.charAt(n) >= '0' && s.charAt(n) <= '9'){
                char r = s.charAt(n);
                temp = 10 * temp +  (r - '0');
                n++;
            }
            nums = nums + temp * flag;
        }
    }
        return nums;
    }
}

这关就到这里 , 下一关见!

你可能感兴趣的:(算法村,算法,java,数据结构)