题目
请你设计一个队列,支持在前,中,后三个位置的
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); } } }