数据结构之栈

数据结构笔记
在python中使用类来实现栈,用列表来容纳栈的数据项,将列表的尾端作为栈顶。

class Stack():
    # set the end of the list as the top of the stack
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return len(self.items) == 0

    def push(self,item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[len(self.items)-1]

    def size(self):
        return len(self.items)

中缀转后缀算法
在后缀表达式中:
1.操作数的顺序未发生改变,操作符出现的顺序与运算次序一致;
2.操作符比操作数要晚输出,故在扫描到第二个操作数时,要先将操作符保存起来,由于优先级的规则,其可能要反转次序输出;
3.“全括号”表达式,操作符应出现在左括号对应的右括号位置,故在遇到左括号时,要进行标记,表示其中的操作符运算优先级提升,一旦扫描到对应的右括号,就可以输出此运算符;

总结:
从左至右扫描中缀表达式,采用暂存未处理的操作符;栈顶的操作符即为最近存进去的,当遇到新的操作符时,两者进行比较,再行处理。

流程:
先将表达式转换为单词列表:[‘A’, ‘+’, ‘B’, ‘*’, ‘C’]
1.从左到右扫描中缀表达式列表
单词为操作数,直接添加至后缀表达式列表的末尾;
单词为左括号:压入栈;
单词为右括号,反复弹出栈顶操作符至输出列表末尾,直至碰到左括号;
单词为操作符,和栈顶的操作符优先级进行比较,如果栈顶的优先级高于等于它,则反复弹出栈顶操作符加入输出列表末尾,直至栈顶操作符优先级低于它,然后将其压入栈;
2.扫描完毕后,将栈中所有剩余操作符一次弹出加入,添加到输出列表末尾;

def infixToPostfix(string):
    pre = {}
    pre["*" ] = 3
    pre['/'] = 3
    pre['+'] = 2
    pre['-'] = 2
    pre["("] = 1
    opstack = Stack()
    tokenList = [i for i in string]
    postfixList = []
    for token in tokenList:
        if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token in "01234556789":
            postfixList.append(token)
        elif token == '(':
            opstack.push(token)
        elif token == ")":
            topToken = opstack.pop()
            while topToken != '(':
                postfixList.append(topToken)
        else:
            while (not opstack.isEmpty()) and pre[opstack.peek()] >= pre[token]:
                postfixList.append(opstack.pop())
            opstack.push(token)
    while not opstack.isEmpty():
        postfixList.append(opstack.pop())
    return " ".join(postfixList)

后缀表达式求值

流程:
将表转换为单词列表
1.从左到右扫描单词列表
如果单词为操作数,转换为int,压入栈;
如果单词为操作符,开始求值,从栈顶弹出2个数,先弹出的右操作数,后弹出的为左操作数,将所求值压入栈;
2.扫描完毕后,最终值在栈顶

def math_oprea(op,op1,op2):
    if op == '*':
        return op1 * op2
    elif op == '/':
        return op2 / op1
    elif op == '+':
        return op1 + op2
    else:
        return op2 - op1

def postfixEval(string):
    operandStack = Stack()
    tokenList = [i for i in string]
    for token in tokenList:
        if token in '0123456789':
            operandStack.push(int(token))
        else:
            op_right = operandStack.pop()
            op_left = operandStack.pop()
            value = math_oprea(token,op_right,op_left)
            operandStack.push(value)
    return operandStack.pop()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值