如何利用Python列表实现栈和队列

文摘   2024-11-09 13:58   江苏  

利用Python列表实现栈

在Python中,列表是一种非常灵活的数据结构,可以用来实现多种数据结构,比如栈和队列。今天我们先来看看如何用列表实现栈。

1. 栈的基本概念

栈是一种后进先出(LIFO, Last In First Out)的数据结构。想象一下你把书一本一本地放在桌子上,每次只能拿最上面的一本书,这就是栈的工作方式。

2. 使用列表实现栈

Python列表提供了许多内置方法,可以很方便地用来实现栈的基本操作。我们主要会用到以下方法:

  • append(x): 将元素x添加到列表的末尾。
  • pop(): 移除列表的最后一个元素并返回它。

示例代码

# 创建一个空的栈
stack = []

# 添加元素到栈中
stack.append(1)
stack.append(2)
stack.append(3)

print("栈的当前状态:", stack)  # 输出: [1, 2, 3]

# 弹出栈顶元素
top_element = stack.pop()
print("弹出的元素:", top_element)  # 输出: 3
print("栈的当前状态:", stack)  # 输出: [1, 2]

3. 栈的常见操作

除了基本的入栈和出栈操作,我们还可以实现一些常见的栈操作,比如检查栈是否为空、获取栈的大小等。

示例代码

# 检查栈是否为空
def is_empty(stack):
    return len(stack) == 0

# 获取栈的大小
def size(stack):
    return len(stack)

# 示例
stack = []
print("栈是否为空:", is_empty(stack))  # 输出: True
stack.append(1)
print("栈的大小:", size(stack))  # 输出: 1

利用Python列表实现队列

接下来,我们来看看如何用列表实现队列。

1. 队列的基本概念

队列是一种先进先出(FIFO, First In First Out)的数据结构。想象一下你在银行排队,最先来的客户最先被服务,这就是队列的工作方式。

2. 使用列表实现队列

虽然Python列表可以用来实现队列,但直接使用列表的appendpop方法效率不高,因为pop(0)的时间复杂度是O(n)。为了提高效率,我们可以使用collections.deque,它是一个双端队列,支持两端高效的插入和删除操作。

示例代码

from collections import deque

# 创建一个空的队列
queue = deque()

# 添加元素到队列中
queue.append(1)
queue.append(2)
queue.append(3)

print("队列的当前状态:", queue)  # 输出: deque([1, 2, 3])

# 弹出队首元素
front_element = queue.popleft()
print("弹出的元素:", front_element)  # 输出: 1
print("队列的当前状态:", queue)  # 输出: deque([2, 3])

3. 队列的常见操作

除了基本的入队和出队操作,我们还可以实现一些常见的队列操作,比如检查队列是否为空、获取队列的大小等。

示例代码

# 检查队列是否为空
def is_empty(queue):
    return len(queue) == 0

# 获取队列的大小
def size(queue):
    return len(queue)

# 示例
queue = deque()
print("队列是否为空:", is_empty(queue))  # 输出: True
queue.append(1)
print("队列的大小:", size(queue))  # 输出: 1

实战案例:使用栈和队列解决括号匹配问题

假设我们需要编写一个程序来检查一个字符串中的括号是否匹配。例如,输入字符串 "((()))" 应该返回 True,而输入字符串 "(())(" 应该返回 False

1. 使用栈实现括号匹配

我们可以使用栈来解决这个问题。每当遇到左括号时,将其压入栈中;每当遇到右括号时,检查栈顶是否有对应的左括号。如果没有,说明括号不匹配。

示例代码

def is_parentheses_matched(s):
    stack = []
    mapping = {")""(""}""{""]""["}

    for char in s:
        if char in mapping.values():
            stack.append(char)
        elif char in mapping.keys():
            if not stack or stack.pop() != mapping[char]:
                return False
        else:
            continue

    return not stack

# 测试
input_str = "((()))"
print(f"输入: {input_str}, 是否匹配: {is_parentheses_matched(input_str)}")  # 输出: True

input_str = "(())("
print(f"输入: {input_str}, 是否匹配: {is_parentheses_matched(input_str)}")  # 输出: False

2. 使用队列实现括号匹配

虽然使用栈是解决括号匹配问题的常用方法,但也可以尝试使用队列来实现。每当遇到左括号时,将其加入队列;每当遇到右括号时,检查队首是否有对应的左括号。如果没有,说明括号不匹配。

示例代码

from collections import deque

def is_parentheses_matched_with_queue(s):
    queue = deque()
    mapping = {")""(""}""{""]""["}

    for char in s:
        if char in mapping.values():
            queue.append(char)
        elif char in mapping.keys():
            if not queue or queue.popleft() != mapping[char]:
                return False
        else:
            continue

    return not queue

# 测试
input_str = "((()))"
print(f"输入: {input_str}, 是否匹配: {is_parentheses_matched_with_queue(input_str)}")  # 输出: True

input_str = "(())("
print(f"输入: {input_str}, 是否匹配: {is_parentheses_matched_with_queue(input_str)}")  # 输出: False

总结

本文介绍了如何使用Python列表实现栈和队列,并通过具体的代码示例展示了栈和队列的基本操作。我们还通过一个实战案例,使用栈和队列解决了括号匹配问题。

好了,今天的分享就到这里了,我们下期见。如果本文对你有帮助,请动动你可爱的小手指点赞、转发、在看吧!

文末福利

公众号消息窗口回复“编程资料”,获取Python编程、人工智能、爬虫等100+本精品电子书。

精品系统

微信公众号批量上传发布系统

关注我👇,精彩不再错过


手把手PythonAI编程
分享与人工智能和python编程语言相关的笔记和项目经历。
 最新文章