栈和队列是两种常见的数据结构,它们在元素的插入和删除方式上有所区别。
栈:
- 栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构。
- 在栈中,元素只能从栈顶添加或删除。
- 添加元素称为压栈(push),删除元素称为弹栈(pop)。
- 最后被压入栈的元素将会第一个被弹出。
举个例子,你可以把栈想象成一叠盘子,最后放上去的盘子会最先被取走。
栈的实现(代码):
class Stack { constructor() { this.items = []; // 栈内元素存储数组 } push(element) { // 入栈 this.items.push(element); } pop() { // 出栈 if (this.isEmpty()) return null; return this.items.pop(); } peek() { // 获取栈顶元素 if (this.isEmpty()) return null; return this.items[this.items.length - 1]; } isEmpty() { // 判断栈是否为空 return this.items.length === 0; } size() { // 获取栈内元素个数 return this.items.length; } clear() { // 清空栈 this.items = []; } }
如何使用:
let stack = new Stack(); stack.push(1); stack.push(2); stack.push(3); console.log(stack.pop()); // 3 console.log(stack.peek()); // 2 console.log(stack.isEmpty()); // false console.log(stack.size()); // 2 stack.clear(); console.log(stack.isEmpty()); // true
队列:
- 队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。
- 在队列中,元素只能从队尾添加,从队首删除。
- 添加元素称为入队(enqueue),删除元素称为出队(dequeue)。
- 最先入队的元素将会最先出队。
以排队买票为例,队列就像是人们排队等候的队伍,第一个来的人会第一个买到票。
队列的实现
class Queue { constructor() { this.items = []; // 队列内元素存储数组 } enqueue(element) { // 入队 this.items.push(element); } dequeue() { // 出队 if (this.isEmpty()) return null; return this.items.shift(); } front() { // 获取队首元素 if (this.isEmpty()) return null; return this.items[0]; } isEmpty() { // 判断队列是否为空 return this.items.length === 0; } size() { // 获取队列内元素个数 return this.items.length; } clear() { // 清空队列 this.items = []; } }
使用示例:
let queue = new Queue(); queue.enqueue(1); queue.enqueue(2); queue.enqueue(3); console.log(queue.dequeue()); // 1 console.log(queue.front()); // 2 console.log(queue.isEmpty()); // false console.log(queue.size()); // 2 queue.clear(); console.log(queue.isEmpty()); // true
总结: 栈和队列都是常用的数据结构,但它们在操作顺序和特性上有所不同。栈适用于需要后进先出操作的场景,而队列适用于需要先进先出操作的场景。具体使用哪种数据结构取决于具体的问题和需求。