栈(Stack)和队列(Queue)是两种常用的数据结构,它们在计算机科学中有着广泛的应用。它们的主要区别在于元素的添加和移除方式。
栈(Stack):
- 栈是一种后进先出(Last In First Out, LIFO)的数据结构。
- 栈只允许在一端(称为栈顶)进行添加(push)和移除(pop)操作。
- 最后被添加到栈中的元素将是第一个被移除的元素。
- 栈的两个主要操作是:
- push:将一个元素添加到栈顶。
- pop:移除栈顶的元素,并返回它。
- 栈的其他操作可能包括:
- peek:查看栈顶的元素但不移除它。
- is_empty:检查栈是否为空。
- 栈在表达式求值、函数调用、撤销/重做功能等方面有广泛应用。
队列(Queue):
- 队列是一种先进先出(First In First Out, FIFO)的数据结构。
- 队列允许在一端(称为队尾)添加元素,在另一端(称为队首)移除元素。
- 最先被添加到队列中的元素将是第一个被移除的元素。
- 队列的两个主要操作是:
- push:在队尾添加一个元素。
- pop:移除队首的元素,并返回它。
- 队列的其他操作可能包括:
- front:查看队首的元素但不移除它。
- is_empty:检查队列是否为空。
- 队列在任务调度、缓冲处理、广度优先搜索算法等方面有广泛应用。
用链表实现栈和队列是一种常见的做法,因为链表的动态性质非常适合这些数据结构的插入和删除操作。下面是如何使用链表来实现栈和队列的简述:
用链表实现栈
- 定义节点:首先定义一个链表节点,通常包含数据部分和指向下一个节点的指针。
- 初始化栈:创建一个指向链表头部的指针,初始时指向
null
,表示栈为空。 - Push操作:添加元素到栈顶。创建一个新节点,将其数据部分设置为要添加的值,然后将新节点的指针指向当前的栈顶节点,最后更新栈顶指针为新节点。
- Pop操作:移除栈顶元素。首先检查栈是否为空,如果不为空,保存栈顶节点的数据,然后将栈顶指针移动到下一个节点,最后释放原栈顶节点的内存。
- get_top操作:查看栈顶元素。检查栈是否为空,如果不为空,返回栈顶节点的数据,但不移除它。
用链表实现队列
- 定义节点:与栈类似,定义一个链表节点,包含数据部分和指向下一个节点的指针。
- 初始化队列:创建两个指针,一个指向队首(front),一个指向队尾(rear),初始时都指向
null
,表示队列为空。 - push操作:在队尾添加元素。创建一个新节点,将其数据部分设置为要添加的值,然后将新节点的指针设置为
null
。如果队列为空,新节点既是队首也是队尾。否则,将队尾节点的指针指向新节点,然后更新队尾指针为新节点。 - pop操作:从队首移除元素。首先检查队列是否为空,如果不为空,保存队首节点的数据,然后将队首指针移动到下一个节点,最后释放原队首节点的内存。如果队首和队尾指针相同,表示队列中只有一个元素,移除后队列变为空,需要将队尾指针也设置为
null
。 - getFront操作:查看队首元素。检查队列是否为空,如果不为空,返回队首节点的数据,但不移除它。