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

题目

实现一个字符串表达式的加减法,输入形式为: 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)
相关推荐
im_AMBER6 分钟前
学习日志05 python
python·学习
大虫小呓11 分钟前
Python 处理 Excel 数据 pandas 和 openpyxl 哪家强?
python·pandas
哪 吒23 分钟前
2025B卷 - 华为OD机试七日集训第5期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷
摸爬滚打李上进1 小时前
重生学AI第十六集:线性层nn.Linear
人工智能·pytorch·python·神经网络·机器学习
HuashuiMu花水木1 小时前
PyTorch笔记1----------Tensor(张量):基本概念、创建、属性、算数运算
人工智能·pytorch·笔记
凛铄linshuo3 小时前
爬虫简单实操2——以贴吧为例爬取“某吧”前10页的网页代码
爬虫·python·学习
牛客企业服务3 小时前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
胡斌附体3 小时前
linux测试端口是否可被外部访问
linux·运维·服务器·python·测试·端口测试·临时服务器
likeGhee4 小时前
python缓存装饰器实现方案
开发语言·python·缓存
项目題供诗4 小时前
黑马python(二十五)
开发语言·python