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

题目

实现一个字符串表达式的加减法,输入形式为: 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)
相关推荐
Blossom.11817 分钟前
把AI“撒”进农田:基于极值量化与状态机的1KB边缘灌溉决策树
人工智能·python·深度学习·算法·目标检测·决策树·机器学习
Red Car17 分钟前
如何向文件夹内所有PDF增加水印
python·pdf
Q_Q51100828527 分钟前
python+uniapp基于微信小程序团购系统
spring boot·python·微信小程序·django·uni-app·node.js·php
java1234_小锋1 小时前
TensorFlow2 Python深度学习 - 循环神经网络(LSTM)示例
python·rnn·深度学习·tensorflow2
lkbhua莱克瓦241 小时前
Java基础——面向对象进阶复习知识点8
java·笔记·github·学习方法
测试老哥1 小时前
Postman环境变量设置全攻略
自动化测试·软件测试·python·测试工具·职场和发展·接口测试·postman
惜月_treasure2 小时前
Text2SQL与工作流实现:让数据库查询变得轻松又高效
数据库·人工智能·python
QT 小鲜肉2 小时前
【数据结构与算法基础】05. 栈详解(C++ 实战)
开发语言·数据结构·c++·笔记·学习·算法·学习方法
码猩3 小时前
获取dm音视频文案
python
给我起把狙3 小时前
Django与Tornado框架深度对比:从MVCMTV到高并发架构设计
python·django·tornado