栈(Stack)是一种后进先出(Last In First Out, LIFO)的数据结构,它遵循两个主要原则:
-
后进先出(LIFO):最后一个被“压入”(push)栈的元素总是第一个被“弹出”(pop)的元素。换句话说,最顶部的元素总是最先被移除的。
-
只能在一端操作:栈只有一个操作端点,称为栈顶(top)。所有的元素都只能通过栈顶进行添加或移除。栈底(bottom)是栈的固定端点,元素不能从栈底添加或移除。
栈的常见操作包括:
- push(元素):将元素添加到栈顶。
- pop():移除并返回栈顶的元素。如果栈为空,这个操作通常会导致错误或异常。
- peek() 或 top():返回栈顶的元素,但不移除它。
- isEmpty():检查栈是否为空。
- size():返回栈中元素的数量。
栈在计算机科学中有许多应用,包括函数调用、表达式求值、内存分配等。例如,在函数调用时,计算机使用栈来存储局部变量和返回地址,这样当函数返回时,它可以恢复调用它的函数的状态。
队列(Queue)是一种先进先出(First In First Out, FIFO)的数据结构。对于队列的操作,你有两个主要选项,但通常我们只考虑其中一种,即“在尾部添加(enqueue),在头部移除(dequeue)”。
队列的常见操作包括:
- enqueue(元素):将元素添加到队列的尾部(或称为“后端”或“尾部”)。
- dequeue():从队列的头部(或称为“前端”或“头部”)移除并返回元素。如果队列为空,这个操作通常会导致错误或异常。
- front():返回队列头部的元素,但不移除它。
- isEmpty():检查队列是否为空。
- size():返回队列中元素的数量。
队列在计算机科学中也有许多应用,例如任务调度、打印任务队列、消息传递等。在这些应用中,元素按照它们到达的顺序进行处理,先到达的元素先被处理。
至于你提到的“在头部添加,在尾部移除”,这不是队列的典型操作,这样的数据结构通常被称为“双端队列”(Deque)或“双端链表”。双端队列允许在两端添加和移除元素,但它仍然遵循先进先出的原则,只是提供了更多的灵活性。