参考自: https://github.com/awangdev/LintCode/edit/master/Java/Implement%20Stack%20using%20Queues.java
代码及测试案例:
使队列queue1中最新存入的元素始终在队列front,这样可以保证后进先出。实现栈的功能。
后面附了几种方法,测试都是可以用的。
package com.company;
import java.util.LinkedList;
import java.util.Queue;
public class TwoQueueImplStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
/**
* Initialize your data structure here.
*/
public TwoQueueImplStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
/**
* Push element x onto stack.
*/
public void push(int x) {
queue2 = queue1;
queue1 = new LinkedList<>();//q1留空,目的是每次新加入的元素都在q1队列的front
queue1.offer(x);//q1的front加入x
while (!queue2.isEmpty()) {
queue1.offer(queue2.poll());
}
}
/**
* Removes the element on top of the stack and returns that element.
*/
public int pop() {
return queue1.poll();
}
/**
* Get the top element.
*/
public int top() {
return queue1.peek();
}
/**
* Returns whether the stack is empty.
*/
public boolean empty() {
return queue1.isEmpty();
}
public static void main(String[] args) {
TwoQueueImplStack qs = new TwoQueueImplStack();
qs.push(2);
qs.push(4);
qs.push(7);
qs.push(5);
System.out.println(qs.pop());
System.out.println(qs.pop());
qs.push(1);
System.out.println(qs.pop());
}
}
E 如题. #### Queue, 倒水 ##### 做法1
push(x) -- Push element x onto stack. Notes: Depending on your language, queue may not be supported natively. You may assume that all operations are valid class MyStack {
/** Initialize your data structure here. */ /**
Implement a stack by two queues. The queue is first in first out (FIFO). Have you met this question in a real interview? Yes */ /* class Stack { // Pop the top of the stack // Return the top of the stack public void swap(){ // Check the stack is empty or not. |
另一段代码比较:
package com.company;
import java.util.ArrayDeque;
import java.util.Queue;
public class TwoQueueImplStack {
Queue<Integer> queue1 = new ArrayDeque<Integer>();
Queue<Integer> queue2 = new ArrayDeque<Integer>();
/*
* 向栈中压入数据
*/
public void push(Integer element){
//两个队列都为空时,优先考虑 queue1
if(queue1.isEmpty() && queue2.isEmpty()){
queue1.add(element);
return;
}
//如果queue1为空,queue2有数据,直接放入queue2
if(queue1.isEmpty()){
queue2.add(element);
return;
}
//如果queue2为空,queue1有数据,直接放入queue1中
if(queue2.isEmpty()){
queue1.add(element);
return;
}
}
/*
* 从栈中弹出一个数据
*/
public Integer pop(){
//如果两个栈都为空,则没有元素可以弹出,异常
if(queue1.isEmpty() && queue2.isEmpty()){
try{
throw new Exception("satck is empty!");
}catch(Exception e){
e.printStackTrace();
}
}
//如果queue1中没有元素,queue2中有元素,将其queue2中的元素依次放入queue1中,直到最后一个元素,弹出即可
if(queue1.isEmpty()){
while(queue2.size() > 1){
queue1.add(queue2.poll());
}
return queue2.poll();
}
//如果queue2中没有元素,queue1中有元素,将其queue1中的元素依次放入queue2中,直到最后一个元素,弹出即可
if(queue2.isEmpty()){
while(queue1.size() > 1){
queue2.add(queue1.poll());
}
return queue1.poll();
}
return (Integer)null;
}
public static void main(String[] args) {
TwoQueueImplStack qs = new TwoQueueImplStack();
qs.push(2);
qs.push(4);
qs.push(7);
qs.push(5);
System.out.println(qs.pop());
System.out.println(qs.pop());
qs.push(1);
System.out.println(qs.pop());
}
}