世外云

栈 python

Python栈算法的实现与简单应用示例

一、栈的基本概念

栈(Stack)是一种特殊的线性表,它只允许在表的一端进行插入和删除操作,这一端被称为栈顶,相对地,把另一端称为栈底,向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈 python-图1

二、Python中栈的实现

Python中可以使用列表(list)来实现栈的功能,以下是一个简单的栈实现:

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

    def is_empty(self):
        return not bool(self.items)

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

    def pop(self):
        if not self.is_empty():
            return self.items.pop()
        else:
            return None

    def peek(self):
        if not self.is_empty():
            return self.items[-1]
        else:
            return None

三、栈的应用示例

1. 括号匹配问题

括号匹配问题是栈的经典应用场景之一,给定一个只包含括号的字符串,判断括号是否匹配,对于字符串"({[]})",返回True;对于字符串"({[)]}",返回False。

遍历字符串,遇到左括号就进栈,遇到右括号就出栈并检查是否匹配,如果遍历完字符串后栈为空,则说明括号匹配;否则,不匹配。

栈 python-图2

代码实现:

def is_matched(s):
    stack = Stack()
    for char in s:
        if char in "([{":
            stack.push(char)
        elif char in ")]}":
            if not stack.is_empty():
                top = stack.pop()
                if (char == ")" and top != "(") or (char == "]" and top != "[") or (char == "}" and top != "{"):
                    return False
            else:
                return False
    return stack.is_empty()

2. 逆波兰表达式求值问题

逆波兰表达式是一种后缀表达式,它的运算符位于操作数之后,表达式"3 + 4 * 2 / ( 1 - 5 )"是逆波兰表达式,给定一个逆波兰表达式,计算其值,对于表达式"3 4 + 2 * 1 5 - /",返回-3.0。

使用两个栈,一个用于存储操作数,另一个用于存储运算符,遍历逆波兰表达式,遇到数字就进操作数栈,遇到运算符就从操作数栈中弹出两个操作数进行计算,并将结果压入操作数栈,操作数栈中只剩下一个元素,即为表达式的值。

def eval_rpn(s):
    num_stack = []
    op_stack = []
    for token in s.split():
        if token in "+-*/":
            b = num_stack.pop()
            a = num_stack.pop()
            if token == "+": result = a + b; op_stack.append(result)
            elif token == "-": result = a - b; op_stack.append(result)
            elif token == "*": result = a * b; op_stack.append(result)
            elif token == "/": result = a / b; op_stack.append(result)
        else: num_stack.append(float(token))
    return num_stack[0] if len(num_stack) == 1 else None

四、相关问题与解答栏目

问题1:Python中还有其他实现栈的方式吗?

除了使用列表实现栈之外,还可以使用链表实现栈,链表实现的栈需要定义一个链表节点类和一个链表栈类,链表节点类包含数据域和指向下一个节点的指针;链表栈类包含一个头节点指针和一些基本操作方法,链表实现的栈在插入和删除操作上比列表实现的栈更高效。

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
请登录后评论...
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~