前言
java已经提供了堆和栈的相对应的类,这里只是模拟一下队列。
队列是一种先进先出的线性表。
基础
java5中新增加了java.util.Queue接口,用以支持队列的常见操作
LinkedList类实现了Queue接口
使用offer()来加入元素,使用poll()来获取并移出元素
实现:
public class ceshi {
public static void main(String[] args) {
//add()和remove()方法在失败的时候会抛出异常(不推荐)
Queue<String> queue = new LinkedList<String>();
//添加元素
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("d");
queue.offer("e");
for (String q : queue) {
System.out.println(q);
}
System.out.println("===");
System.out.println("poll=" + queue.poll()); //返回第一个元素,并在队列中删除
for (String q : queue) {
System.out.println(q);
}
System.out.println("===");
System.out.println("element=" + queue.element()); //返回第一个元素
for (String q : queue) {
System.out.println(q);
}
System.out.println("===");
System.out.println("peek=" + queue.peek()); //返回第一个元素
for (String q : queue) {
System.out.println(q);
}
}
}
两个队列模拟一个堆栈
/**
* 两个队列模拟一个堆栈
* 队列:先进先出
* 堆栈:先进后出
* 解决方法:两个队列始终有一个为空,另一个有全部数据,每次取数据,就取完存入另一个队列。
*/
interface IStack<T> {
void push(T newElement);
T pop();
T top();
int size();
}
class StackImpl<T> implements IStack<T> {
private Queue<T> queue1 ;
private Queue<T> queue2;
private T topRecord;
private int size;
public StackImpl() {
this.queue1 = new LinkedList<>();
this.queue2 = new LinkedList<>();
this.size = 1;
}
@Override
public void push(T newElement) {
if (queue2.size() == 0) {
queue1.offer(newElement);
} else if (queue1.size() == 0) {
queue2.offer(newElement);
}
topRecord = newElement;
size++;
}
@Override
public T pop() {
T result = null;
if (size <= 0) {
return null;
}
if (queue2.size() == 0) {
if (queue1.size() == 1) {
topRecord = null;
result= queue1.poll();
}
while (queue1.size() > 1) {
result = queue1.poll();
if (queue1.size() == 2) {
topRecord = result;
}
queue2.offer(result);
}
result = queue1.poll();
} else if (queue1.size() == 0) {
if (queue2.size() == 1) {
topRecord = null;
result= queue2.poll();
}
while (queue2.size() > 1) {
result = queue2.poll();
if (queue2.size() == 2) {
topRecord = result;
}
queue1.offer(result);
}
result = queue2.poll();
}
size--;
return result;
}
@Override
public T top() {
return topRecord;
}
@Override
public int size() {
return this.size;
}
}