1、数据结构-队列
队列是一种特殊的线性表,只允许你在头部删除元素,在尾部添加新的元素。
2、队列的方法 enqueue:从队列尾部添加一个元素 dequeue:从队列头部删除一个元素 head:返回头部的元素,注意只是看一个谁在最前面,不是删除 size:返回队列大小 clear:清空队列 isEmpty:判断队列是否为空
3、实现队列方法的代码如下:
function Queue(){
var items = [] //存储数据
// 向队列尾部添加一个元素
this.enqueue = function(item){
items.push(item)
}
// 移除队列头部的元素
this.dequeue = function(){
return items.shirt()
}
// 返回队列的头部的元素
this.head = function(){
return items[0]
}
// 返回队列尾部元素
this.tail = function(){
return items[items.length-1]
}
// 返回队列大小
this.size = function(){
return items.length
}
// 清空队列
this.clear = function(){
items = []
}
// 判断队列是否为空
this.isEmpty = function(){
return items.length == 0
}
}
4、小试几道练习题
4.1 约瑟夫环(普通模式),题目要求:有一个数组a[100]存放0-99,要求每隔两个数删除一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数。 代码如下:
// 准备好数据
var arr_list = []
for(var i=0;i<100;i++){
arr_list.push(i)
}
function del_ring(arr_list){
// 把数组元素都放入到队列中
var queue = new Queue();
for(var i,i<arr_list.length;i++){
queue.enqueue(arr_list[i])
}
var index = 0
while(queue.size()!=1){
// 弹出一个元素,判断是否需要删除
var item = queue.dequeue()
index+=1
// 每隔两个就要删除掉一个,那么不是被删除的元素就放回到队列尾部
if(index%3 != 0){
queue.enqueue(item)
}
}
return queue.head()
}
4.2 斐波那契数列(普通模式),使用队列计算斐波那契数列的第n项
function fibonacci(n){
queue = new Queue()
var index = 0
//先放入斐波那契数列的前两个数值
queue.enqueue(1)
queue.enqueue(1)
while(index < n-2){
// 出队列一个元素
var del_item = queue.dequeue()
// 取队列头部元素
var head_item = queue.head()
var next_item = del_item + head_item
// 将计算结果放入队列
queue.enqueue(next_item)
index += 1
}
queue.dequeue()
return queue.head()
}
4.3 用队列实现栈(困难模式) 实现代码如下:
function QueueStack(){
var queue1 = new Queue()
var queue2 = new Queue()
var data_queue = null // 放数据的队列
var empty_queue = null // 空队列,备用
// 确认哪个队列放数据,哪个队列做备份空队列
var init_queue = function(){
//都为空,默认返回1
if(queue1.isEmpty()){
data_queue = queue2
empty_queue = queue1
}else{
data_queue = queue1
empty_queue = queue2
}
}
// push方法
this.push = function(item){
init_queue()
data_queue.enqueue(item)
}
// top方法
this.top = function(){
init_queue()
return data_queue.tail()
}
//pop方法
// pop方法要弹出栈顶元素,这个栈顶元素是队列的尾元素,队尾元素不能删除,我们可以把data_queue中的元素除了队尾元素之外的都移除到empty_queue中,这样data_queue中就只有队尾元素,最后移除队尾元素并返回即可实现pop
this.pop = function(){
init_queue()
while(data_queue.size() > 1){
empty_queue.enqueue(data_queue.dequeue())
}
return data_queue.dequeue()
}
}
var q_stack = new QueueStack()
4.4 打印杨辉三角(困难模式) 使用队列打印出杨辉三角的前n行,n >= 1 实现代码如下:
function print_yanghui(n){
var queue = new Queue()
queue.enqueue(1)
// 第一层for循环控制打印几层
for(var i=0;i<n;i++){
var line = ''
var pre = 0
// 第二层循环控制打印第i层
for(var j=0;j<i;j++){
var item = queue.dequeue()
line += item + ''
// 计算下一行的内容
var value = item + pre
pre = item
queue.enqueue(value)
}
// 每一层最后一个数字是1,上面的循环没有计算最后一个数
queue.enqueue(1)
console.log(line)
}
}
print_yanghui(10)
周末云里雾里写了点,脑细胞损失不少,继续加油!