当前位置: 首页 > article >正文

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

题目

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

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)

http://www.kler.cn/a/500003.html

相关文章:

  • DeepSeek:性能强劲的开源模型
  • 【Qt】QThread总结
  • 监听器与RBAC权限模型
  • Python的循环
  • 寻找最短路径
  • 【论文阅读】SDA-FC: Bridging federated clustering and deep generative model
  • JAVA中线程池ThreadPoolExecutor的使用
  • “天上北斗+地上5G”,遨游北斗终端绘危急特场景通信新蓝图
  • 音视频入门基础:RTP专题(2)——使用FFmpeg命令生成RTP流
  • 【学习路线】Python进阶 详细知识点学习路径(附学习资源)
  • 机器学习之基本概念 - 特征、标签、样本
  • 8分钟入门 Overleaf Latex-笔记
  • <C++学习>C++ Boost 算法集合操作教程
  • Android 13 framework方法通过AIDL方式供三方APP使用
  • 最新前端面试题(附答案)
  • 使用uniapp 微信小程序一些好用的插件分享
  • 基于单片机的指纹密码锁
  • Linux x86_64 程序静态链接之重定位
  • C#读取本地网络配置信息全攻略
  • redis的监控
  • spring boot发送邮箱,java实现邮箱发送(邮件带附件)3中方式【保姆级教程一,代码直接用】
  • 第四、五章图论和网络爬虫+网络搜索