java基础——队列

前言

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;
    }
}
posted @ 2018-11-24 15:49  田云  阅读(264)  评论(0编辑  收藏  举报