1.用栈实现队列
分析:栈的数据操作是后进先出,队列的操作是先进先出,所以我们想要达成目的,可以用一个辅助的栈;
流程:有两个栈,一个是用于添加数据的pushStack,一个是用于弹出数据的popStack;当需要添加数据时,直接加入到pushStack;当需要弹出数据时(队列弹出数据先进先出,所以目的是弹出pushStack栈底的数据),但是我们只能弹出栈顶的元素,这个时候依次弹出pushStack的栈顶元素,压入到popStack中,这个时候pushStack的栈底元素就变成了popStack的栈顶元素,我们再弹出popStack的栈顶元素,就达到了目的。
//两个栈实现队列结构,用到了java.util.stack里面的pop,push,peek方法
public static class TwoStackQueue{
private Stack<Integer> stackPush;
private Stack<Integer> stackPop;
//1.构造函数中初始化好两个栈
public TwoStackQueue(){
stackPush=new Stack<>();
stackPop=new Stack<>();
}
//2.队列中添加元素
public void push(int i){
stackPush.push(i);
}
//3.队列中删除输出第一个元素
public int poll(){
if(stackPush.isEmpty()&&stackPop.isEmpty()){
throw new RuntimeException("队列为空");
}
else if(stackPop.isEmpty()){
while(!stackPush.isEmpty()){
stackPop.push(StackPush.pop());
}
}
return stackPop.pop();
}
//4.队列中不删除输出第一个元素
public int poll(){
if(stackPush.isEmpty()&&stackPop.isEmpty()){
throw new RuntimeException("队列为空");
}
else if(stackPop.isEmpty()){
while(!stackPush.isEmpty()){
stackPop.push(StackPush.pop());
}
}
return stackPop.peek();
}
}
2.用队列实现栈
分析:队列的操作是先进先出,栈的数据操作是后进先出,所以我们想要达成目的,可以用一个辅助的队列;
流程:有两个队列,一个是用于添加数据的队列queue,一个是用来作为帮助的队列help;当要添加数据的时候,直接添加到queue中;当需要弹出数据的时候(栈是后进先出,我们想要弹出的是queue的尾部的元素,但是因为是队列先进先出,我们只能弹出头部的元素,所以我们的目的是让queue中的尾部的元素变为他的头部元素。),就留下他的尾部元素之外的所有元素添加到help队列中,弹出数据,然后help和queue交换(为了保证queue指向的是数据,而此时数据全部都在队列);
//queue(队列) deque(双向队列) linkedList(实现了deque接口)
//poll方法 获取并且移除列表中第一个元素
public static class TwoQueueStack{
private Queue<Integer> queue;
private Queue<Integer> help;
//1.构造方法初始化这两个队列
public TwoQueueStack(){
queue=new LinkedList<>();
help=new LinkedList<>();
}
//2.添加元素
public void push(int i){
queue.add(i);
}
//3.弹出并且删除元素(对应与栈的pop操作)
public int pop(){
if(queue.isEmpty()){
throw new RuntimeException("栈是空的");
}
while(queue.size()>1){
help.add(queue.poll());
}
int res=queue.poll();
swap();
return res;
}
//4.弹出但是不删除元素(对应于栈的peek操作)
public int peek(){
if(queue.isEmpty()){
throw new RuntimeException("栈是空的");
}
while(queue.size()!=1){
help.add(queue.poll());
}
int res=queue.poll();
help.add(res);
swap();
return res;
}
}