基础
上一节我总结了一下栈的数据结构,它在前端中的应用以及一些面试常问的题目。今天我总结一下队列,栈和队列总是孟不离焦。队列也是一种特殊的线性表,可以用数组或者链表实现。它和栈的不同点在于,栈是先进后出,而队列中的数据总是先进先出。
假如有一个序列1,2,3,4,5。将它按顺序加入队列中,它的结构如下图:
在现实生活中,排队就是一个典型的队列,不能插队,只能排到队尾,随着前面的人办完事出队列,最后会轮到你。
而在JS的程序的事件循环中同样用到了队列,JS的在执行时会维护一个event queue,遇到异步任务会将其加入event queue,执行完同步任务,就会从event queue中拿出异步任务继续执行。
队列的实现
同样js的数组提供shift()方法,它可以删除数组的第一个元素。数组提供的方法使我们可以很容易的用数组来实现队列这种数据结构。
实现队列需要实现以下几个基本的方法:enqueue(入队列),dequeue(出队列),head(返回队列第一个元素),size(返回队列的大小),clear(清除队列),isEmpty(判断队列是否为空)。
function Queue() {
let items = [];
this.enqueue = function(item) {
items.push(item);
}
this.dequeue = function(item) {
return items.shift()
}
this.head = function() {
return items[0];
}
this.size = function() {
return items.length;
}
this.clear = function() {
items = []
}
this.isEmpty = function() {
return items.length == 0;
}
}
复制代码
队列的应用题
- 队列与栈的相互转换
我们学习完栈和队列这两种数据结构之后就可以思考,如何用栈来实现一个队列,又如何用队列来实现一个栈。
用两个队列实现一个栈:
function QueueStack() {
let queue1 = new Queue();
let queue2 = new Queue();
let empty_queue = null;
let data_queue = null;
function initQueue() {
if (queue1.isEmpty() && queue2.isEmpty()) {
data_queue = queue1;
empty_queue = queue2;
} else if (queue1.isEmpty()) {
data_queue = queue2;
empty_queue = queue1;
} else {
data_queue = queue1;
empty_queue = queue2;
}
}
this.push = function(item) {
initQueue();
data_queue.push(item);
}
this.pop = function(item) {
initQueue();
while (data_queue.size() > 1) {
empty_queue.enqueue(data_queue.dequeue());
}
return data_queue.dequeue();
}
this.top = function() {
initQueue();
while (data_queue.size() > 1) {
empty_queue.enqueue(data_queue.dequeue());
}
let head = data_queue.head();
empty_queue.enqueue(data_queue.dequeue());
return head;
}
}
复制代码
用两个栈实现一个队列:
function StackQueue() {
let push_stack = new Stack();
let pop_stack = new Stack();
this.enqueue = function(item) { //醉了
push_stack.push(item);
}
this.dequeue = function() {
if (pop_stack.size() != 0) {
return pop_stack.pop();
} else {
while (push_stack.size()) {
let item = push_stack.pop();
pop_stack.push(item);
}
return pop_stack.pop();
}
}
this.head = function() {
if (pop_stack.size() != 0) {
return pop_stack.top();
} else {
while (push_stack.size()) {
let item = push_stack.pop();
pop_stack.push(item);
}
return pop_stack.top();
}
}
}
复制代码