python后缀计算器简单实现

参考:www.bilibili.com/video/BV1E4…

实现

stack实现

class Stack:
    def __init__(self):
        self.list = []

    def add_data(self, data):
        self.list.append(data)

    def pop(self):
        if len(self.list) != 0:
            return self.list.pop(-1)
        else:
            print("空栈无法弹出数据")

    def peek(self):
        if self.list:
            return self.list[-1]
        else:
            return None

    def is_empty(self):
        return len(self.list) == 0
复制代码

计算器实现

跟视频老师的后缀表达式有点不一样,但测试了很多式子,没有出错,因为是对的

from stack import Stack
import re


class Calculator:
    """
    1.首先要中缀转后缀
    2.后缀表达式的计算
    """

    def __init__(self):
        # 存放操作符
        self.operatorStack = Stack()
        # 存放最终的后缀表达式
        self.expression = []

    # 判断是数字还是操作符
    def whichType(self, char):
        if 48 <= ord(char) <= 57:
            return "NUM"
        else:
            return "OPERATOR"

    # 传入2个数字和操作符计算,-和/是 num2在前
    def calculate(self, num1, num2, operator):
        if operator == "+":
            return num1 + num2
        elif operator == "-":
            return num2 - num1
        elif operator == "*":
            return num1 * num2
        elif operator == "/":
            return num2 / num1

    # 中缀转后缀
    def infixToSuffix(self, expression):
        # 指针,从头指到尾
        pointer = 0
        while True:
            # 数字,考虑多位数情况
            if self.whichType(expression[pointer]) == "NUM":
                num = ""
                while self.whichType(expression[pointer]) == "NUM":
                    num += expression[pointer]
                    # pointer = len(expression)的情况就是到了式子的尾部了,跳出循环
                    if pointer != len(expression) - 1:
                        pointer += 1
                    else:
                        break
                # 后缀表达式加入多位数
                self.expression.append(int(num))
            # 操作符 + - * / ( )
            else:
                # 操作符是(或者operatorStack为空
                if expression[pointer] == "(" or self.operatorStack.is_empty():
                    self.operatorStack.add_data(expression[pointer])
                # 如果操作符是),一直pop到 (
                elif expression[pointer] == ")":
                    while self.operatorStack.peek() != "(":
                        self.expression.append(self.operatorStack.pop())
                    # pop出 (
                    self.operatorStack.pop()
                # 操作符是+或-的情况
                elif expression[pointer] == "+" or expression[pointer] == "-":
                    # 当上一个操作符是+-*/任何一个都需要先把操作符pop出,举个例子:5-3+1,这个式子就会报错,
                    # self.operatorStack.peek() is not None是因为operatorStack为空时会返回None
                    while self.operatorStack.peek() != "(" and self.operatorStack.peek() is not None:
                        self.expression.append(self.operatorStack.pop())
                    self.operatorStack.add_data(expression[pointer])
                # 操作符是 * 或 /
                elif expression[pointer] == "*" or expression[pointer] == "/":
                    # 上一个操作符是*或/
                    while self.operatorStack.peek() == "*" or self.operatorStack.peek() == "/":
                        self.expression.append(self.operatorStack.pop())
                    self.operatorStack.add_data(expression[pointer])
                pointer += 1
            if pointer == len(expression) - 1:
                break
        # 将操作符栈剩余的操作符弹出
        while not self.operatorStack.is_empty():
            self.expression.append(self.operatorStack.pop())
        return self.expression

    def suffixCalculate(self, expression):
        numStack = Stack()
        pointer = 0
        while True:
            # 数字就加入数栈
            if re.match("[0-9]+$", str(expression[pointer])):
                while re.match("[0-9]+$", str(expression[pointer])):
                    numStack.add_data(int(expression[pointer]))
                    pointer += 1
            # 操作符的话,弹出2个数字和操作符计算后加入数栈
            else:
                num1 = numStack.pop()
                num2 = numStack.pop()
                numStack.add_data(self.calculate(num1, num2, expression[pointer]))
                pointer += 1
            if pointer == len(expression):
                break
        return numStack.pop()


cal = Calculator()
# a = cal.infixToSuffix("10-2*(3+4)+5*2+6")
a = cal.infixToSuffix("(((10+30)*100)/50)/2-1000+100*10")
# a = cal.infixToSuffix("3*5-10")
print(a)
print(cal.suffixCalculate(a))

复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享