《剑指Offer》-05栈与队列

用两个栈实现队列

题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var stack1=[],
stack2=[];
function push(node)
{
// write code here
stack1.push(node);//进栈
}

function pop()
{
// write code here
//两个都是空栈,说明此时队列是空的
if(stack1.length===0 && stack2.length===0)return;
//栈1元素传入栈2
if(stack2.length===0){
for (var i=stack1.length;i>0;i--){ //这里注意stack1的长度在改变,不能写成(var i=0;i<stack1.length;i++)
stack2.push(stack1.pop());
}
}
return stack2.pop();//出栈
}

总结:
栈的特性:先进后出
队列的特性:先进先出


滑动窗口的最大值

题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function maxInWindows(num, size)
{
// write code here
if(size==0){ //边界条件还是要写的
return [];
}
var num_m,
que=[];
for(var i =0;i<=num.length-size;i++){ //确定滑动窗口的起始点位置
num_m=num[i];
for(var j=0,k=i;j<size;k++,j++){ //找到从起始点开始,size长度内的最大值,并将值传给que数组
if(num[k]>num_m){
num_m=num[k];
}
}
que.push(num_m);
}
return que;
}
0%