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

题目

实现一个字符串表达式的加减法,输入形式为: 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)
相关推荐
EnCi Zheng4 分钟前
P2G-Python字符串方法完全指南-split、join、strip、replace的Python编程利器
开发语言·python
潇洒畅想5 分钟前
1.1 从∑到∫:用循环理解求和与累积
java·数据结构·python·算法
有一个好名字7 分钟前
Claude Code 50+命令全解析
python
weixin_395772479 分钟前
计算机网络学习笔记】初始网络之网络发展和OSI七层模型
笔记·学习·计算机网络
liliangcsdn17 分钟前
LLM如何与mcp server交互示例
linux·开发语言·python
Lupino18 分钟前
拯救迷失的荧光溶解氧传感器:从“三无”到“复活”的全记录
python
小陈phd31 分钟前
多模态大模型学习笔记(三十四)——ChatTTS:新一代中文语音合成工具原理与实战解析
笔记·学习·语音识别
xcjbqd033 分钟前
SQL中视图能否嵌套存储过程_实现复杂自动化报表逻辑
jvm·数据库·python
ZC跨境爬虫35 分钟前
海南大学交友平台开发实战day7(实现核心匹配算法+解决JSON请求报错问题)
前端·python·算法·html·json
迷藏49437 分钟前
**发散创新:基于角色与属性的混合权限模型在微服务架构中的实战落地**在现代分布式系统中,
java·python·微服务·云原生·架构