面试题:通过栈实现队列
题目描述:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
说明:
- 你 只能 使用标准的栈操作 —— 也就是只有
push to top
,peek/pop from top
,size
, 和is empty
操作是合法的。 - 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
解题思路:
设置两个栈s1和s2,s1用来存储入队的元素,s2用来实现出队方法:
1.入队方法的实现():将待入队的元素通过s1的压栈操作尾插到s1中。
2.出队方法的实现(pop):
出队之前,判断两个栈(s1和s2)是否都为空,为空,返回-1;
如果s2为空,将s1中的所有元素通过出栈操作压入s2中(循环条件为s1不为空),待全部压入完后,通过poll(出栈)操作返回s2的栈顶元素;
3.获取队头元素(peek):
跟出队操作类似,但唯一不同的是最后返回的是栈的peek()方法。
实现步骤:
1.通过压栈将x压入栈s1中实现入队操作。
class ArrayQueue{//声明两个栈public ArrayDeque<Integer> stack1;public ArrayDeque<Integer> stack2;public ArrayQueue(){//对栈进行初始化stack1 = new ArrayDeque<>();stack2 = new ArrayDeque<>();}
2。出队方法的实现:
public int pop(){//出队列操作if(empty()){return -1;}while(stack2.isEmpty()){ //若stack2为空,将stack1中的元素全部为尾插到stack2中while(!stack1.isEmpty()){stack2.push(stack1.pop());}return stack2.pop();}}
3.peek方法的实现:
和出队列类似
具体代码如下:
public int peek() {if (empty()) {return -1;}while (stack2.isEmpty()) {while (!stack1.isEmpty()) {stack2.push(stack1.pop());}}return stack2.peek(); //和pop类似,但要将stack返回的值改为peek。}
最后empty方法
public boolean empty(){return stack1.isEmpty() && stack2.isEmpty(); //s1与s2均不为空}
结语:
今天的题目讲解结束,喜欢的朋友可以点个赞!!!