java Java栈实现队列,队列实现栈
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java Java栈实现队列,队列实现栈相关的知识,希望对你有一定的参考价值。
package com.github.congyh.algorithm;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Queue;
import java.util.Stack;
public class StackQueue {
/**
* 双栈实现队列
*
* @param <E>
*/
public static class MyQueue<E> {
private Stack<E> stack1 = new Stack<>();
private Stack<E> stack2 = new Stack<>();
public boolean offer(E elem) {
stack1.push(elem);
return true;
}
public E peek() {
if (isEmpty()) {
throw new NoSuchElementException();
} else {
if (stack2.isEmpty()) {
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
return stack2.peek();
}
}
public E poll() {
peek();
return stack2.pop();
}
public boolean isEmpty() {
return stack1.isEmpty() && stack2.isEmpty();
}
}
/**
* 双队列实现栈
*
* 注意: 无论是实现队列还是栈, 都需要至少实现四个方法.
*
* @param <E>
*/
public static class MyStack<E> {
// 注意: 与双栈实现队列不同的是, 这里两个队列的关系是对等的.
private Queue<E> queue1 = new LinkedList<>();
private Queue<E> queue2 = new LinkedList<>();
public void push(E e) {
if (queue2.isEmpty()) {
queue1.offer(e);
} else { // 只有queue2不为空的情况下才加入到queue2中. 两者同时为空的时候加入到queue1中
queue2.offer(e);
}
}
public E peek() {
E ret = null;
if (queue1.isEmpty() && !queue2.isEmpty()) {
while (!queue2.isEmpty()) {
ret = queue2.poll();
queue1.offer(ret);
}
} else if (!queue1.isEmpty() && queue2.isEmpty()) {
while (!queue1.isEmpty()) {
ret = queue1.poll();
queue2.offer(ret);
}
}
return ret;
}
public E pop() {
E ret = null;
if (queue1.isEmpty() && !queue2.isEmpty()) {
while (!queue2.isEmpty()) {
ret = queue2.poll();
// 与peek方法的唯一区别就是, 这里最后一个元素直接弹出不入队.
if (!queue2.isEmpty()) {
queue1.offer(ret);
}
}
} else if (!queue1.isEmpty() && queue2.isEmpty()) {
while (!queue1.isEmpty()) {
ret = queue1.poll();
if (!queue1.isEmpty()) {
queue2.offer(ret);
}
}
}
return ret;
}
public boolean isEmpty() {
return queue1.isEmpty() && queue2.isEmpty();
}
}
}
以上是关于java Java栈实现队列,队列实现栈的主要内容,如果未能解决你的问题,请参考以下文章