使用队列实现栈的下列操作:
push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空
栈的原理:先进后出;
队的原理:先进先出.
思路:可以考虑用两个队相互协作实现一个栈,在一个队中直接用push存储数据,当要进行pop操作时,将该队中的元素除最先进队的元素外全部导入另一个栈,再对前者进行remove操作,最后将后者中的元素导回前者;top方法与pop方法类似,区别在于前一个栈中剩余的最后一个元素也要存入后一个栈.
package Test;
import java.util.LinkedList;
import java.util.Queue;
public class myStack {
private Queue<Integer> queue1 = new LinkedList<>(); //用于存放数据
private Queue<Integer> queue2 = new LinkedList<>(); //用于辅助获取数据(始终为空)
/** Push element x onto stack. */
public void push(int x) {
queue1.offer(x);
}
/** Removes the element on top of the stack and returns that element. */
public Integer pop() {
//若队列为空
if (queue1.isEmpty()){
return null;
}
//将队列queue1中除最后一个元素外全部出队并存入queue2
while(queue1.size() > 1) {
int ret = queue1.remove();
queue2.add(ret);
}
//获取队列尾部元素,即栈的栈顶元素
int cur = queue1.remove();
//交换队列queue1和queue2
swap();
return cur;
}
//交换队列内容
private void swap(){
Queue<Integer> queue3 = queue1;
queue1 = queue2;
queue2 = queue3;
}
/** Get the top element. */
public Integer top() {
//处理队列为空的情况
if (queue1.isEmpty()){
return null;
}
//将队列queue1中除最后一个元素外的元素出队,并存入queue2
while(queue1.size() > 1){
int ret = queue1.remove();
queue2.add(ret);
}
//将队列中最后一个元素,即栈顶元素返回
int cur = queue1.remove();
queue2.add(cur);
swap();
return cur;
}
/** Returns whether the stack is empty. */
public boolean empty() {
return queue1.isEmpty();
}
}