【钉钉在线笔试题】字符串表达式的加减法

题目

实现一个字符串表达式的加减法,输入形式为: 1.2 + (2 - ( 3 +4.5 ) )- (2 + 1) 的字符串表达式,计算出表达式的结果。

Python实现

python 复制代码
import re
from typing import List, Union


class Stack:
    """实现一个栈"""

    def __init__(self) -> None:
        self.items = []

    def is_empty(self) -> bool:
        """判断栈是否为空"""
        return self.items == []

    def push(self, item: str):
        """入栈"""
        self.items.append(item)

    def pop(self) -> str:
        """出栈"""
        return self.items.pop()

    def peek(self) -> str:
        """返回栈顶元素"""
        return self.items[len(self.items) - 1]

    def size(self) -> int:
        """返回栈的大小"""
        return len(self.items)


class StringAdditionSubtraction:
    """字符串加减法"""

    def split_expression(self, str_expression: str) -> List[Union[str, float, int]]:
        """将字符串按运算符进行分割"""

        def to_int_or_float(num: str) -> Union[int, float]:
            """将数字字符串转换为整数或浮点数"""

            if "." in num:
                return float(num)
            else:
                return int(num)

        num = ""
        expressions = []
        for char in str_expression:
            if not char.strip():  # 跳过空格
                continue
            if char in {"+", "-", "(", ")"}:  # 运算符及括号
                if num:
                    expressions.append(to_int_or_float(num))
                    num = ""
                expressions.append(char)
            elif char.isdigit() or char == ".":
                num += char
        if num:
            expressions.append(to_int_or_float(num))
            num = ""
        return expressions

    def calc(self, expressions: List[Union[str, float, int]]) -> Union[float, int]:
        """计算表达式"""

        value = 0
        operator = "+"
        for item in expressions:
            if isinstance(item, int) or isinstance(item, float):
                if operator == "+":
                    value += item
                elif operator == "-":
                    value -= item
            else:
                operator = item
        return value

    def main(self, str_expression: str):
        stack = Stack()

        expressions = self.split_expression(str_expression)
        for item in expressions:
            if item in {"+", "-", "("} or isinstance(item, int) or isinstance(item, float):
                stack.push(item)
            else:  # 遇到)时,开始计算
                temp_expressions = []
                while stack.peek() != "(":
                    temp_expressions.append(stack.pop())
                stack.pop()
                temp_expressions.reverse()
                temp_value = self.calc(temp_expressions)
                stack.push(temp_value)
        value = self.calc(stack.items)
        return value


if __name__ == "__main__":
    client = StringAdditionSubtraction()
    case1 = " 1.2 + (2 - ( 3 +4.5 ) )- (2 + 1)"
    value = client.main(case1)
    print(value)
相关推荐
不会代码的小猴4 小时前
C++的第九天笔记
开发语言·c++·笔记
测试19984 小时前
功能测试、自动化测试、性能测试的区别
自动化测试·python·功能测试·测试工具·职场和发展·性能测试·安全性测试
Data_agent5 小时前
1688获得1688店铺所有商品API,python请求示例
java·开发语言·python
一晌小贪欢5 小时前
【Python办公】-图片批量添加文字水印(附代码)
开发语言·python·图片水印·python水印·python添加水印·图片添加水印
海上飞猪5 小时前
【python】基础数据类型
python
我命由我123455 小时前
开发中的英语积累 P19:Inspect、Hint、Feedback、Direction、Compact、Vulnerability
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
万邦科技Lafite5 小时前
一键获取淘宝关键词商品信息指南
开发语言·数据库·python·商品信息·开放api·电商开放平台
Jurio.6 小时前
Python Ray 分布式计算应用
linux·开发语言·python·深度学习·机器学习
爱加糖的橙子6 小时前
Dify升级到Dify v1.10.1-fix修复CVE-2025-55182漏洞
人工智能·python·ai
Pyeako6 小时前
python网络爬虫
开发语言·爬虫·python·requsets库