zoukankan      html  css  js  c++  java
  • Basic Calculator 基本计算器

    2018-09-27 22:02:36

    一、Basic Calculator II

    问题描述:

    问题求解:

    sign用来保存前一个符号,用num来记录数字,如果碰到一个符号或者到达结尾,则需要进行入栈操作,这个时候需要结合符号进行相应的运算。

        public int calculate(String s) {
            if (s == null || s.length() == 0) return 0;
            int res = 0;
            Stack<Integer> stack = new Stack<>();
            char sign = '+';
            int num = 0;
            for (int i = 0; i < s.length(); i++) {
                if (Character.isDigit(s.charAt(i))) {
                    num = num * 10 + s.charAt(i) - '0';
                }
                if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == s.length() - 1) {
                    if (sign == '/') num = stack.pop() / num;
                    if (sign == '*') num = stack.pop() * num;
                    if (sign == '-') num *= -1;
                    stack.push(num);
                    sign = s.charAt(i);
                    num = 0;
                }
            }
            while (!stack.isEmpty()) res += stack.pop();
            return res;
        }
    

    二、Basic Calculator

    问题描述:

    问题求解:

    本问题中只包含了+,-和括号,首先如果只有+,-的话连Stack都不需要就可以直接遍历一遍相加就可以了。

    但是如果存在括号的情况,那么就需要使用到一个Stack来对之前计算到的数字和符号进行保存。

        public int calculate(String s) {
            if (s == null || s.length() == 0) return 0;
            Stack<Integer> stack = new Stack<>();
            int res = 0;
            int sign = 1;
            int num = 0;
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (Character.isDigit(c)) num = num * 10 + c - '0';
                else if (c == '+') {
                    res += num * sign;
                    sign = 1;
                    num = 0;
                }
                else if (c == '-') {
                    res += num * sign;
                    sign = -1;
                    num = 0;
                }
                else if (c == '(') {
                    stack.push(res);
                    stack.push(sign);
                    res = 0;
                    sign = 1;
                }
                else if (c == ')') {
                    res += num * sign;
                    res *= stack.pop();
                    res += stack.pop();
                    num = 0;
                }
            }
            if (num != 0) res += num * sign;
            return res;
        }
    
  • 相关阅读:
    为什么需要字节对齐?
    从sprintf函数谈符号扩展问题
    sprintf介绍
    char的本质
    使用sprintf连接字符串
    sscanf用法简介
    IE6,IE7,FF | CSS + DIV 兼容问题综合解决方案CSS HACK
    Div+css优点
    MS SQL数据库备份和恢复存储过程(加强版本)
    如何实现HTML页面无刷新更换CSS样式
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/9715959.html
Copyright © 2011-2022 走看看