堆栈与队列

89 阅读2分钟

堆栈与队列

什么是堆栈和队列?

在计算机科学中,堆栈(Stack)和队列(Queue)是两种基本的数据结构,它们在程序设计中有广泛的应用。

堆栈(Stack)

堆栈是一种遵循后进先出(LIFO, Last In First Out)原则的线性表。这意味着最后插入堆栈中的元素将最先被移除。堆栈的主要操作包括入栈(push)、出栈(pop)和查看顶元素(top或peek)。在实际应用中,堆栈常用于函数调用、表达式求值以及撤销机制等方面。

队列(Queue)

队列则是一种遵循先进先出(FIFO, First In First Out)原则的线性表。这意味着最先插入队列中的元素将首先被移除。队列的主要操作包括入队(enqueue)、出队(dequeue)以及查看队首元素(front或peek)。在计算机科学中,队列常用于任务调度、打印队列管理等场景。

堆栈与队列的区别

  • 数据访问模式:堆栈主要通过顶部进行操作;而队列通常只允许从一端插入和另一端删除。

  • 应用场景:堆栈常用于撤销操作、括号匹配等问题;队列适用于任务调度等场景。

堆栈与队列的应用实例

递归调用的实现

在编程中,堆栈常被隐式地用来支持递归函数的调用。每当一个函数被调用时,其当前状态会被压入堆栈,并且当该函数返回时,它的状态从堆栈中弹出。

def recursive_function(n):
    if n == 0:
        return 1
    else:
        result = n * recursive_function(n - 1)
        print(result)  # 打印过程中的递归调用结果
        return result

recursive_function(5)

表达式求值

堆栈可以用来实现中缀表达式的解析和求值。通过将操作数压入堆栈,运算符用于触发两个元素的操作并返回结果。

def evaluate_expression(expression):
    operators = {'+': lambda x, y: x + y,
                 '-': lambda x, y: x - y}
    stack = []

    for token in expression:
        if token.isdigit():
            stack.append(int(token))
        elif token in operators:
            b, a = stack.pop(), stack.pop()
            result = operators[token](a, b)
            stack.append(result)

    return stack[0]

expression = "3 + 5 - 2"
print(evaluate_expression(expression.split()))

队列的应用

队列可以用于模拟打印任务的排队,其中每个新任务被添加到队列尾部,并且下一个要处理的任务总是队列中的第一个。

from collections import deque

def print_tasks(tasks):
    queue = deque()

    for task in tasks:
        queue.append(task)

        if len(queue) > 3:  # 限制最多等待的打印任务数量
            oldest_task = queue.popleft()
            print(f"Printing {oldest_task}")

print_tasks(["文档1", "表格2", "报告3", "图片4"])

堆栈和队列是数据结构的基础组成部分,它们各自的特点使得它们在不同的场景下能够发挥独特的作用。理解这些基础概念对于编写高效且易于维护的代码至关重要。