LeetCode 227. Basic Calculator II

简介: 实现一个基本的计算器来计算一个简单的字符串表达式的值。字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。

v2-16496ca663afc5fec59103bbde757337_1440w.jpg

Description



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.


Example 1:

Input: "3+2*2"

Output: 7


Example 2:

Input: " 3/2 "

Output: 1


Example 3:

Input: " 3+5 / 2 "

Output: 5


Note:

You may assume that the given expression is always valid.

Do not use the eval built-in library function.


描述



实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。


示例 1:

输入: "3+2*2"

输出: 7


示例 2:

输入: " 3/2 "

输出: 1


示例 3:

输入: " 3+5 / 2 "

输出: 5


说明:

你可以假设所给定的表达式都是有效的。

请不要使用内置的库函数 eval。


思路



  • 我们使用两个栈来实现表达式求值.
  • 其中一个用来存储数字,另一个来存储符号.
  • 我们从给定的字符串中不断的取出数字和符号,若是数字,我们将其压入数字栈,如果是符号,我们和当前栈顶的符号进行比较,如果当前符号的优先级小于等于栈顶元素的符号,我们弹出符号栈顶元素,并用此符号对数字栈栈顶的两个元素进行运算,并将运算的结果重新压入数字栈,直到当前符号大于符号栈栈顶元素或者符号栈为空.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-01-28 20:41:10
# @Last Modified by:   何睿
# @Last Modified time: 2019-01-28 21:28:48
class Solution:
    def calculate(self, s):
        """
        :type s: str
        :rtype: int
        """
        # 声明两个栈,用于存储数字和操作符
        stack1, stack2 = [], []
        # num用于从字符串中取出数字
        num = 0
        for item in s:
            # 取数字
            if item.isdigit():
                num = num * 10 + ord(item) - ord("0")
            # 如果为空则继续执行
            elif item == " ":
                continue
            else:
                # 向数字栈中添加数字
                stack1.append(num)
                # 数字重置为0
                num = 0
                # 如果符号栈为空,将当前符号压入栈
                if not stack2:
                    stack2.append(item)
                else:
                    # 如果当前操作符优先级小于等于符号栈栈顶操作符,我们持续进行运算
                    while stack2 and self.compare(stack2[-1], item):
                        # 从数字栈中取出两个数字
                        num1, num2 = stack1.pop(), stack1.pop()
                        # 对这两个数字进行当前符号的运算,并将运算结果压入数字栈
                        stack1.append(self.operate(stack2.pop(), num2, num1))
                    # 将当前符号压入符号栈
                    stack2.append(item)
        # 将最后剩下的数字压入数子栈
        stack1.append(num)
        # 对剩下的数字和符号进行运算
        while stack2 and stack1:
            num1, num2 = stack1.pop(), stack1.pop()
            stack1.append(self.operate(stack2.pop(), num2, num1))
        return stack1.pop()
    def operate(self, operator, num1, num2):
        # 运算函数
        if operator == "+": return num1 + num2
        if operator == "-": return num1 - num2
        if operator == "*": return num1 * num2
        if operator == "/": return num1 // num2
    def compare(self, op1, op2):
        # op2的优先级>=op1的优先级返回True
        # 否则返回False
        if (op1 == "+" or op1 == "-") and (op2 == '+' or op2 == "-"):
            return True
        if (op1 == "*" or op1 == "/") and (op2 == '*' or op2 == '/'):
            return True
        if (op1 == "*" or op1 == "/") and (op2 == '+' or op2 == "-"):
            return True
        return False


源代码文件在这里.


目录
相关文章
Leetcode [224] Basic Calculator 基于语法树的解法
通过生成语法树,解决表达式求值问题
284 0
LeetCode 227 Basic Calculator II
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/51337819 ...
696 0
[LeetCode] Basic Calculator II
The basic idea of is as follows: Maintain a deque operands for the numbers and another deque operations for the operators +, -, *,/`.
686 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
63 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
128 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
46 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口