1. 程式人生 > >java基礎——佇列

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;
    }
}