题目
实现一个字符串表达式的加减法,输入形式为: 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)