NC240 计算器(一)

计算器(一)

https://www.nowcoder.com/practice/9b1fca7407954ba5a6f217e7c3537fed?tpId=196&tqId=39581&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26pageSize%3D50%26search%3D%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=undefined&tags=581&title=

栈(计算表达式)

import java.util.*;


public class Solution {
    public int calculate (String s) {
    //创建一个栈,用于存每个数字的数值和符号位
      Stack<Integer>stack1=new Stack<>();
      //num存每个数字的数值,sign存每个数字对应的符号位,res存结果
      int num=0,res=0,sign=1;
      for(int i=0;i<s.length();i++){
        //如果是多位数字,就求出来
        if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
            num=num*10+(s.charAt(i)-'0');
            //如果是加号,就将之前对应的数值累加上去
            //并且将数值变量清0,后一个数的符号位记作1,表示后面是正数
        }else if(s.charAt(i)=='+'){
            res+=sign*num;
            num=0;
            sign=1;
            //累加上一个数
            //将数值位清0,由于是负号,所以将后面的数标记为负号,即将减去一个数看作加上一个负数
        }else if(s.charAt(i)=='-'){
            res+=sign*num;
            num=0;
            sign=-1;
            //如果是左括号,将上一次的答案数值res存入栈中,将后面的数的符号也存入栈中
            //由于要求另一对括号内的数值,所以将res清零,sign=1
        }else if(s.charAt(i)=='('){
            stack1.push(res);
            stack1.push(sign);
            res=0;
            sign=1;
            //如果遇到右括号,则将右括号前的那个数先累加到res中
            //再将num=0, 便于求后面的数
            //在确定这对括号内求出的值的正负
            //再将之前的值累加上去
        }else if(s.charAt(i)==')'){
            res+=sign*num;
            num=0;
            res*=stack1.pop();
            res+=stack1.pop();
        }
      }
      //例如:3+(1+2)-8
      //可见最后的数-8之前还没有累加上去过,所以累加上去
      if(num!=0){
        res+=sign*num;
      }
      return res;
    }
}
全部评论

相关推荐

点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务