题目
实现一个MyQueue类,该类用两个栈来实现一个队列。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
注意点:
peek()函数和pop()函数都需要有返回值(不是说pop()函数就没有返回值了)
说明:
- 你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size 和 is empty 操作是合法的。
(意思是说top()、size()、empty()操作可以用) - 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
- 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。
思路
第一个栈保存正常push,另一个保存逆序栈,也就是队列顺序。第二个优先于第一个栈。
算法
用s1和s2来表示两个栈
s1用于入队,s2用于出队,s1+s2完成队列。
push():入队的话就先入栈s1
pop():出队的话先判断s2是不是空的,如果是空的就把s1中的元素压入s2;如果不是空的,就让s2中的元素出栈。
empty():判断s1和s1是不是空的。
EG:
- 入队:1 2 3 4 5
- 出队:1 2 3 4 5
入队(即入栈s1): 1 2 3 4 5
但是由于栈是后进先出的,因此需要s2配合才能完成队列的先进先出
压入s2: 5 4 3 2 1
出队(即s2出栈): 1 2 3 4 5
代码
class