如何用栈实现一个队列
使用栈实现队列的下列操作
push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
const MyQueue = function ()
this.stack1 = [];
this.stack2 = [];
};
MyQueue.prototype.push = function (x) {
this.stack1.push(x);
};
MyQueue.prototype.pop = function () {
if (this.stack2.length <= 0) {
while (this.stack1.length !== 0) {
this.stack2.push(this.stack1.pop());
}
}
return this.stack2.pop();
};
MyQueue.prototype.peek = function () {
if (this.stack2.length <= 0) {
while (this.stack1.length != 0) {
this.stack2.push(this.stack1.pop());
}
}
const stack2Len = this.stack2.length;
return stack2Len && this.stack2[stack2Len - 1];
};
MyQueue.prototype.empty = function () {
return !this.stack1.length && !this.stack2.length;
};
滑动窗口问题
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7]
解释:滑动窗口的位置
[1 3 -1] -3 5 3 6 7
1 [3 -1 -3] 5 3 6 7
1 3 [-1 -3 5] 3 6 7
1 3 -1 [-3 5 3] 6 7
1 3 -1 -3 [5 3 6] 7
1 3 -1 -3 5 [3 6 7]
最大值分别对应:
3 3 5 5 6 7
提示:你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小。
const maxSlidingWindow = function (nums, k) {
const len = nums.length;
const res = [];
let left = 0;
let right = k - 1;
while (right < len) {
const max = calMax(nums, left, right);
res.push(max);
left++;
right++;
}
return res;
};
function calMax(arr, left, right) {
if (!arr || !arr.length) {
return;
}
let maxNum = arr[left];
for (let i = left; i <= right; i++) {
if (arr[i] > maxNum) {
maxNum = arr[i];
}
}
return maxNum;
}
其他方法
const maxSlidingWindow = function (nums, k) {
const len = nums.length;
const res = [];
const deque = [];
for (let i = 0; i < len; i++) {
while (deque.length && nums[deque[deque.length - 1]] < nums[i]) {
deque.pop();
}
deque.push(i);
while (deque.length && deque[0] <= i - k) {
deque.shift();
}
if (i >= k - 1) {
res.push(nums[deque[0]]);
}
}
return res;
};