题目
请你设计一个队列,支持在前,中,后三个位置的
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]
。
解题思路
- 寻找合适的容器来存储数据;
- 根据要求对每个方法进行编写;
- 对于特殊情况进行分类处理,如:删除中间元素时容器大小为偶数时删除前一个值。
代码展示
class FrontMiddleBackQueue {List<Integer> data = null;public FrontMiddleBackQueue() {data = new ArrayList<>();}public void pushFront(int val) {data.add(0, val);}public void pushMiddle(int val) {int middle = data.size() / 2;data.add(middle, val);}public void pushBack(int val) {data.add(val);}public int popFront() {if(data.isEmpty()){return -1;} else {return data.remove(0);}}public int popMiddle() {if(data.isEmpty()){return -1;} else {int size = data.size();return data.remove(size % 2 == 0 ? data.size() / 2 - 1 : data.size() / 2);}}public int popBack() {if(data.isEmpty()){return -1;} else {return data.remove(data.size() - 1);}}
}