232.用栈实现队列 225. 用队列实现栈
Java中的栈和队列
栈(stack)
Stack<T> stack = new Stack<>();
操作:new(新建)push(入栈)pop(出栈)peek(获取栈顶元素)isEmpty(判断栈是否为空)
队列(Queue)
在Java中,Queue是个接口,底层是通过链表实现的。
Queue<T> queue= new LinkedList<>();
操作:offer()(入队列) poll()(出队列) peek()(获取队头元素)size()(获取队列中有效元素个数) isEmpty()(检测队列是否为空)
232.用栈实现队列
思路:用双栈去实现队列。一个用来push,一个用来pop。
代码如下:
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
public void push(int x) {
stackIn.push(x);
}
public int pop() {
dumpstackIn();
return stackOut.pop();
}
public int peek() {
dumpstackIn();
return stackOut.peek();
}
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
//如果stackOut为空,那么将stackIn中的元素全部放到stackOut中
private void dumpstackIn(){
if (!stackOut.isEmpty()) return;
while (!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
}
225. 用队列实现栈
思路:用双队列去实现栈,其中一个用来做辅助队列。push元素时,应先将队列中的元素,全放到辅助队列中,然后push到队列中后,再将辅助队列的元素在push到后面。这些就颠倒了顺序,完成了用两个队列去实现栈。
代码如下:
class MyStack {
//q1作为主要的队列,其元素排列顺序和出栈顺序相同
Queue<Integer> q1 = new ArrayDeque<>();
//q2仅作为临时放置
Queue<Integer> q2 = new ArrayDeque<>();
public MyStack() {
}
public void push(int x) {
while (q1.size() > 0) q2.add(q1.poll());
q1.add(x);
while (q2.size() > 0) q1.add(q2.poll());
}
public int pop() {
return q1.poll();
}
public int top() {
return q1.peek();
}
public boolean empty() {
return q1.isEmpty();
}
}