返回

熟练掌控栈与队列,数据结构将不再是噩梦!

后端

栈:有序的后进先出

栈是一种遵循“后进先出”(Last-In-First-Out,LIFO)原则的数据结构,就好比一摞盘子,最先放进去的盘子最后取出来。栈具有如下特征:

  • 先进后出(LIFO): 后放入栈中的元素,首先被移出。
  • 只允许在栈顶进行插入和删除操作: 只能从栈顶添加或移除元素。
  • 元素次序遵循后进先出原则: 栈顶元素始终是最近添加的元素。

栈在计算机科学中有广泛的应用,比如:

  • 函数调用: 函数调用时,局部变量和函数参数会被压入栈中,函数返回时,这些变量被弹出。
  • 表达式求值: 运算符和操作数会被压入栈中,按照运算符的优先级进行计算,计算结果从栈中弹出。
  • 递归: 递归函数在调用自身时,当前函数的状态会被压入栈中,递归返回时,当前函数的状态从栈中弹出。

队列:有序的先进先出

队列是一种遵循“先进先出”(First-In-First-Out,FIFO)原则的数据结构,就好比一条长龙,先排队的人先被服务。队列具有如下特征:

  • 先进先出(FIFO): 先放入队列中的元素,首先被移除。
  • 只允许在队尾进行插入操作,只允许在队首进行删除操作: 元素只能从队尾加入,只能从队首移出。
  • 元素次序遵循先进先出原则: 队首元素始终是最早添加的元素。

队列在计算机科学中有广泛的应用,比如:

  • 进程调度: 操作系统使用队列来管理进程,先提交的进程首先被执行。
  • 消息传递: 消息队列用于在进程之间传递消息,先发送的消息首先被处理。
  • 缓冲: 队列可用于缓冲数据,比如网络数据传输时,数据会被先存入队列中,然后再发送出去。

栈与队列的应用

栈和队列在计算机科学中有着广泛的应用。以下是一些常见的应用场景:

  • 栈:
    • 函数调用: 当函数被调用时,其参数和局部变量会被压入栈中。当函数返回时,这些变量会被弹出。
    • 表达式求值: 当表达式被求值时,操作数和运算符会被压入栈中。按照运算符的优先级,从栈中弹出操作数和运算符进行计算。计算结果会被压入栈中。
    • 递归: 当一个函数调用自身时,当前函数的状态会被压入栈中。当递归函数返回时,当前函数的状态会被弹出。
  • 队列:
    • 进程调度: 操作系统使用队列来管理进程。当进程需要被执行时,会被放入队列中。队列中的进程按照先进先出的原则被执行。
    • 消息传递: 消息队列用于在进程之间传递消息。当进程需要发送消息时,会将消息放入队列中。当进程需要接收消息时,会从队列中取出消息。
    • 缓冲: 队列可用于缓冲数据。例如,当数据从网络中接收时,会被先存入队列中。当需要处理数据时,数据会被从队列中取出。

栈与队列的比较

栈和队列都是非常重要的数据结构,它们在计算机科学中有着广泛的应用。栈遵循“后进先出”的原则,队列遵循“先进先出”的原则。栈只允许在栈顶进行插入和删除操作,队列只允许在队尾进行插入操作和在队首进行删除操作。栈和队列都有着广泛的应用,在不同的场景中发挥着各自的作用。

栈与队列的实现

栈和队列都可以使用数组或链表来实现。数组实现简单,但是插入和删除元素需要移动元素,效率较低。链表实现复杂一些,但是插入和删除元素只需要改变指针,效率较高。

数组实现

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

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

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

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

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

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

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

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

    def peek(self):
        return self.items[0]

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

链表实现

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class Stack:
    def __init__(self):
        self.top = None

    def push(self, item):
        new_node = Node(item)
        new_node.next = self.top
        self.top = new_node

    def pop(self):
        if self.top is None:
            return None
        item = self.top.data
        self.top = self.top.next
        return item

    def peek(self):
        if self.top is None:
            return None
        return self.top.data

    def is_empty(self):
        return self.top is None

class Queue:
    def __init__(self):
        self.front = None
        self.rear = None

    def enqueue(self, item):
        new_node = Node(item)
        if self.rear is None:
            self.front = new_node
            self.rear = new_node
        else:
            self.rear.next = new_node
            self.rear = new_node

    def dequeue(self):
        if self.front is None:
            return None
        item = self.front.data
        self.front = self.front.next
        if self.front is None:
            self.rear = None
        return item

    def peek(self):
        if self.front is None:
            return None
        return self.front.data

    def is_empty(self):
        return self.front is None

结束语

栈与队列是数据结构中的基本知识,理解和掌握它们对于算法和编程至关重要。通过学习栈和队列,我们可以更好地理解计算机如何处理和存储数据,并能够编写出更有效和高效的程序。