您的位置:首页 > 产品设计 > UI/UE

[232] Implement Queue using Stacks

2016-07-21 12:46 411 查看

1. 题目描述

Implement the following operations of a queue using stacks.

push(x) – Push element x to the back of queue.

pop() – Removes the element from in front of queue.

peek() – Get the front element.

empty() – Return whether the queue is empty.

Notes:

You must use only standard operations of a stack – which means only push to top, peek/pop from top, size, and is empty operations are valid.

Depending on your language, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack.

You may assume that all operations are valid (for example, no pop or peek operations will be called on an empty queue).

使用栈实现队列。只能使用栈提供的push, peek/pop, size和empty方法。

2. 解题思路

栈和队列不同的地方在于,栈为后进先出,而队列为先进先出。也就是说,对于一个栈,只能看到当前栈顶的元素,但是对于队列,我们要看到位于当前栈中最深处的元素。但是当我们把一个栈翻转过来,栈中最深处的元素就变成了当前栈顶元素,再顺序出栈就能达到队列的效果。所以想法就是使用两个栈,一个栈保存正序列元素,另一个栈用来翻转这些元素。入队操作只需要push到正序列元素中,出队操作则先将正序列元素进行反转,再输出最上面的元素即可。值得一提的是,当前翻转过的栈不为空时,如果将正序列翻转后push进来就打乱了原有栈的顺序,所以需要加一个判断,当当前翻转栈有元素时直接出队即可。



3. Code

import java.util.Stack;

class MyQueue {
Stack<Integer> forwardStack = new Stack<>();
Stack<Integer> reverseStack = new Stack<>();

// Push element x to the back of queue.
public void push(int x) {
forwardStack.push(x);
}

// Removes the element from in front of queue.
public void pop() {
if(reverseStack.empty())
doReverse();
reverseStack.pop();
}

// Get the front element.
public int peek() {
if(reverseStack.empty())
doReverse();
return reverseStack.peek();
}

// Return whether the queue is empty.
public boolean empty() {
return forwardStack.size() == 0 && reverseStack.size() == 0;
}

/**
* 翻转栈
*/
private void doReverse()
{
while(!forwardStack.empty())
{
reverseStack.push(forwardStack.pop());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 栈与队列