栈的特点:先进后出 队列的特点:先进先出 显然,单个队列我们是无法实现栈的操作的,我们这里采用两个队列来实现。
1.入栈、出栈的原理
比如我们现在有一个栈和两个队列,两队列用于模拟实现栈,现有数据12,23,34
我们现在入栈12,23,34,先将数据按顺序放入queue1里面
那我们现在要栈里面出一个34怎么办?因为队列里面必须是队头先出,那我们就把queue1里面的size-1(也就是2)个元素全部放入queue2里面,剩下一个元素就是我们栈中要出的元素 这时34出栈了,我们再要出23怎么办? 同样的道理,把queue2中size-1(也就是1)个元素出到queue1中,剩下最后一个就是要出的
总结如下: 1.入栈的时候,入到不为空的队列(我们这里刚开始两个队列都为空时默认是queue1) 2.出栈的时候,找到不为空的队列,出size-1个元素到另一个队列,剩下的这个元素就是出栈的元素
2.代码实现:
import java.util.LinkedList;
import java.util.Queue;
public class MyStack {
private Queue<Integer> queue1;
private Queue<Integer> queue2;
public MyStack(){
queue1=new LinkedList<>();
queue2=new LinkedList<>();
}
public void push(int x){
if (!queue1.isEmpty()){
queue1.offer(x);
}else if(!queue2.isEmpty()){
queue2.offer(x);
}else{
queue1.offer(x);
}
}
public int pop(){
if(empty()){
return -1;
}
if (!queue1.isEmpty()){
int size=queue1.size();
for(int i=0;i<size-1;i++){
int val=queue1.poll();
queue2.offer(val);
}
return queue1.poll();
}
if (!queue2.isEmpty()){
int size=queue2.size();
for(int i=0;i<size-1;i++){
int val=queue2.poll();
queue1.offer(val);
}
return queue2.poll();
}
return -1;
}
public int top(){
if(empty()){
return -1;
}
if(!queue1.isEmpty()){
int val=0;
int size=queue1.size();
for (int i=0;i<size;i++){
val=queue1.poll();
queue2.offer(val);
}
return val;
}
if ((!queue2.isEmpty())){
int val=0;
int size=queue2.size();
for(int i=0;i<size;i++){
val=queue2.poll();
queue1.offer(val);
}
return val;
}
return -1;
}
public boolean empty(){
return queue1.isEmpty()&&queue2.isEmpty();
}
public static void main(String[] args) {
MyStack myStack=new MyStack();
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
System.out.println(myStack.top());
myStack.pop();
System.out.println(myStack.top());
}
}
运行结果如下:
|