我GitHub上的:剑指offer题解
用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路:
入队push:直接进入栈1
出队pop:如果栈2为空,将栈1的元素出栈并入栈到栈2;如果栈2不为空,栈2出栈
import java.util.Stack;
/**
*
* @author yajie
*两个栈实现一个队列
*思路:入队:直接进入栈1
* 出队:如果栈2为空,将栈1的元素出栈并入栈到栈2;如果栈2不为空,栈2出栈
*/
public class Queue {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public Integer pop(int node) {
if(stack2.isEmpty()) {
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}
变一变:
用两个队列实现栈
首先,在java中,有栈stack。
但是队列的实现,一般
- LinkedList:可以用它来实现双向队列。
- PriorityQueue:基于堆结构实现,可以用它来实现优先队列。
当然还有上述的用栈的方法实现。
所以这里用两个队列实现栈,我们用LinkedList
思路:
入栈:将元素进入队列1
出栈:首先判断队列1中是不是只有一个元素,如果是,将其出队列即可;
如果不是只有一个元素,将队列1的元素全部出队列然后进入队列2,直到队列1只有一个元素。此时将队列1的元素出队列。然后再将队列2的元素出队列进入队列1;
package test;
import java.util.LinkedList;
/**
* 两个队列实现栈的入栈和出栈
* 思路:
* 入栈:将元素进入队列1
* 出栈:首先判断队列1中是不是只有一个元素,如果是,将其出队列即可;
* 如果不是只有一个元素,将队列1的元素全部出队列然后进入队列2,直到队列1只有一个元素。此时将队列1的元素出队列。
* 然后再将队列2的元素出队列进入队列1;
*
*
* 疑问:为什么用linkedlist
*/
public class Stack {
LinkedList<Integer> queue1 = new LinkedList<>();
LinkedList<Integer> queue2 = new LinkedList<>();
public int pop(int node) {//出栈
//只有非空的栈才能出栈
if(queue1.size()==0 && queue2.size()==0) {
System.out.println("栈已经为空了,不能出栈!");
return -1;
}
if(queue1.size()==0 && queue2.size() != 0) {
while(queue2.size()> 0) {
queue1.addLast(queue2.removeFirst());
}
}
if(queue1.size() == 1) {
return queue1.removeFirst();//出栈
}
else {
while(queue1.size()>1) {
queue2.addLast(queue1.removeFirst());
}
return queue1.removeFirst();
}
}
// public int stackSize() {
// return queue1.size() + queue2.size();
// }
public void push(int node) {
queue1.addLast(node);
}
}