一,两个栈实现一个队列。
解题思路:栈的特点是先进后出,队列的特点是先进后出,所以可以把队列1中的元素pop到队列2中,队列2再次取出的时候就可以了。
/**
* 两个栈实现一个队列:
* 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出
* 扩展:栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
* 栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。
* 常用方法:
* boolean empty(),测试堆栈是否为空。
* Object peek(),查看堆栈顶部的对象,但不从堆栈中移除它。
* Object pop(),移除堆栈顶部的对象,并作为此函数的值返回该对象。
* Object push(Object element),把项压入堆栈顶部。
* int search(Object element),返回对象在堆栈中的位置,以 1 为基数,栈顶的位置为1。
*/
public class StackToQueen<T> {
private Stack<T> stack1 = new Stack<>();
private Stack<T> stack2 = new Stack<>();
/**
* 添加数据
* @param num
*/
public void add(T num){
stack1.push(num);
}
/**
* pop出数据
* @param
*/
public void poll(){
if(stack1.isEmpty() && stack2.isEmpty()){
return;
}
//将stack1的元素放入stack2
while (stack1.size() > 0){
stack2.push(stack1.pop());
}
return;
}
public T get(){
if(stack2.isEmpty()){
return null;
}
return stack2.pop();
}
public static void main(String[] args) {
StackToQueen<Integer> stackToQueen = new StackToQueen();
stackToQueen.add(1);
stackToQueen.add(2);
stackToQueen.add(3);
stackToQueen.add(4);
stackToQueen.add(5);
stackToQueen.poll();
System.out.print(stackToQueen.get());
System.out.print(stackToQueen.get());
System.out.print(stackToQueen.get());
System.out.print(stackToQueen.get());
System.out.print(stackToQueen.get());
}
}
二,两个队列实现一个栈。
解题思路:队列一中除最后一个数外其余的数全部导入队列二后返回队列一中的元素,然后对队列二也是如此操作。
/**
* 两个队列实现一个栈
* 思路:队列一中出最后一个数外其余的数全部导入队列二,然后返回队列中的元素,然后对队列二也是如此操作。
* Quenu的常用方法:
* poll() 获取并移除此队列的头,如果此队列为空,则返回 null
* remove() 获取并移除此队列的头,如果此队列为空,则抛出NoSuchElementException异常
*
* peek() 获取队列的头但不移除此队列的头。如果此队列为空,则返回 null
* element() 获取队列的头但不移除此队列的头。如果此队列为空,则将抛出NoSuchElementException异常
*
* offer() 将指定的元素插入此队列(如果立即可行且不会违反容量限制),插入成功返回 true;否则返回 false。
* 当使用有容量限制的队列时,offer方法通常要优于 add方法——add方法可能无法插入元素,而只是抛出一个 IllegalStateException异常
* add() 将指定的元素插入此队列
*/
public class QueenToStack<T> {
Queue<T> queue1 = new LinkedList<>();
Queue<T> queue2 = new LinkedList<>();
//添加
public void push(T num){
queue1.offer(num);
}
//取出
public T pop(){
if (queue1.isEmpty() && queue2.isEmpty()) {
throw new RuntimeException("queue is empty");
}
if (!queue1.isEmpty() && queue2.isEmpty()) {
while (queue1.size() > 1) {
queue2.offer(queue1.poll());
}
return queue1.poll();
}
if (queue1.isEmpty() && !queue2.isEmpty()) {
while (queue2.size() > 1) {
queue1.offer(queue2.poll());
}
return queue2.poll();
}
return null;
}
public static void main(String[] args) {
QueenToStack<Integer> queenToStack = new QueenToStack();
queenToStack.push(1);
queenToStack.push(2);
queenToStack.push(3);
queenToStack.push(4);
queenToStack.push(5);
System.out.print(queenToStack.pop());
System.out.print(queenToStack.pop());
System.out.print(queenToStack.pop());
System.out.print(queenToStack.pop());
System.out.print(queenToStack.pop());
}
}