使用队列实现栈的下列操作:
- push(x) -- 元素 x 入栈
- pop() -- 移除栈顶元素
- top() -- 获取栈顶元素
- empty() -- 返回栈是否为空
注意:
- 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
- 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
- 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。
正解
1)该题与用队列模拟栈的思路很相似,通过一个主队列和一个过度队列的运作,来实现栈的功能;
其核心就是数据在两个队列相互传输的过程中找到那个头。
class MyStack {
private Queue<Integer> queue1 = new LinkedList();
private Queue<Integer> queue2 = new LinkedList();
public MyStack() {
}
public void push(int x) {
queue1.add(x);
}
public int pop() {
int ret = 0;
while (queue1.size() != 1) {
queue2.add(queue1.poll());
}
ret=queue1.poll();
while (!queue2.isEmpty()) {
queue1.add(queue2.poll());
}
return ret;
}
public int top() {
int ret = 0;
while (queue1.size() != 1) {
queue2.add(queue1.poll());
}
ret=queue1.poll();
queue2.add(ret);
while (!queue2.isEmpty()) {
queue1.add(queue2.poll());
}
return ret;
}
public boolean empty() {
return queue1.isEmpty();
}
}
2)上面是用两个队列模拟,实际上一个就可以完成
class MyStack {
private Queue<Integer> queue1 = new LinkedList();
public MyStack() {
}
public void push(int x) {
queue1.add(x);
}
public int pop() {//弹出栈头
int len = queue1.size() - 1;
while (len != 0) {
queue1.add(queue1.poll());
len--;
}
return queue1.poll();
}
public int top() {
int ret=0;
int len = queue1.size() - 1;
while (len != 0) {
queue1.add(queue1.poll());
len--;
}
len=queue1.peek();
queue1.add(queue1.poll());
return len;
}
public boolean empty() {
return queue1.isEmpty();
}
}