题目
请你设计一个队列,支持在前,中,后三个位置的 push 和 pop 操作。
请你完成 FrontMiddleBack 类:
FrontMiddleBack() 初始化队列。 void pushFront(int val) 将 val 添加到队列的 最前面 。 void pushMiddle(int val) 将 val 添加到队列的 正中间 。 void pushBack(int val) 将 val 添加到队里的 最后面 。 int popFront() 将 最前面 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1 。 int popMiddle() 将 正中间 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1 。 int popBack() 将 最后面 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1 。 请注意当有 两个 中间位置的时候,选择靠前面的位置进行操作。比方说:
将 6 添加到 [1, 2, 3, 4, 5] 的中间位置,结果数组为 [1, 2, 6, 3, 4, 5] 。 从 [1, 2, 3, 4, 5, 6] 的中间位置弹出元素,返回 3 ,数组变为 [1, 2, 4, 5, 6] 。
示例
输入:
["FrontMiddleBackQueue", "pushFront", "pushBack", "pushMiddle", "pushMiddle", "popFront", "popMiddle", "popMiddle", "popBack", "popFront"]
[[], [1], [2], [3], [4], [], [], [], [], []]
输出:
[null, null, null, null, null, 1, 3, 4, 2, -1]
解释:
FrontMiddleBackQueue q = new FrontMiddleBackQueue();
q.pushFront(1); // [1]
q.pushBack(2); // [1, 2]
q.pushMiddle(3); // [1, 3, 2]
q.pushMiddle(4); // [1, 4, 3, 2]
q.popFront(); // 返回 1 -> [4, 3, 2]
q.popMiddle(); // 返回 3 -> [4, 2]
q.popMiddle(); // 返回 4 -> [2]
q.popBack(); // 返回 2 -> []
q.popFront(); // 返回 -1 -> [] (队列为空)
解题思路
**本题如14,15题也是采取数组的形式解题,思路大同小异。本题的重点在于获取数组的中间值,在添加mid值时,如果数组长度是偶数,则中间值应该是第leng / 2 个,那么,中间值的下标为 length / 2 - 1, 因为是在中间值得后面添加一个, 所以添加值得位置为 length / 2 - 1 + 1;如果是基数,中间值是 length / 2 向下取整,中间值的下标则是 parseInt(length / 2) - 1, 则 中间值后面一位的下标是parseInt(length / 2) - 1 + 1; 综上, 添加位置为parseInt(length / 2);同理,删除元素的下标可以简化为Math.ceil(length / 2) -1 **
/**
* 构造函数:初始化一个空数组
*/
var FrontMiddleBackQueue = function() {
this.length = 0;
this.list = [];
};
/**
* 添加元素到队首
* @param {number} val
* @return {void}
*/
FrontMiddleBackQueue.prototype.pushFront = function(val) {
this.list.unshift(val);
this.length++;
};
/**
* 添加元素到中间
* @param {number} val
* @return {void}
*/
FrontMiddleBackQueue.prototype.pushMiddle = function(val) {
let index = parseInt(this.length / 2); // 如解题思路中的分析
this.list.splice(index, 0, val);
this.length++;
};
/**
* 添加元素到队尾
* @param {number} val
* @return {void}
*/
FrontMiddleBackQueue.prototype.pushBack = function(val) {
this.list.push(val);
this.length++;
};
/**
* 队首删除元素
* @return {number}
*/
FrontMiddleBackQueue.prototype.popFront = function() {
if(this.length) {
this.length--;
return this.list.shift();
}
return -1;
};
/**
* 队中删除元素
* @return {number}
*/
FrontMiddleBackQueue.prototype.popMiddle = function() {
if (this.length) {
let index = Math.ceil(this.length/2) - 1; // 如解题思路中的分析
let mid = this.list[index];
this.list.splice(index, 1);
this.length--;
return mid;
}
return -1;
};
/**
* 队尾删除元素
* @return {number}
*/
FrontMiddleBackQueue.prototype.popBack = function() {
if(this.length) {
this.length--;
return this.list.pop();
}
return -1;
};