棧和隊列


關於棧與隊列

棧與隊列是特殊的線性表。

訪問,插入,刪除等操作只能在棧頂進行;對於隊列,元素只能從隊尾插入,從隊頭刪除和訪問。

換句話說,棧和隊列是有操作限制的線性表。

順序存儲的棧稱為順序棧;鏈式存儲的棧稱為鏈式棧。

基於數組實現棧

package com.company;

public class StackOperation<T> {

    private T data[];
    private int maxSize;
    private int top;


    //初始化棧
    public StackOperation(int maxSize) {
        this.maxSize=maxSize;
        data=(T[])new Object[maxSize]; //泛型數組不能直接new創建,需要使用Object來創建
        this.top=-1;
    }

    //判斷棧是否為空
    public boolean isEmpty() {
        return (top==-1);
    }

    //判斷棧是否已經滿了
    public  boolean isFull() {
        return (top==maxSize-1);
    }


    //壓棧
    public boolean push(T value) {
        if(isFull()) {
            return false;
        }
        top++;
        data[top]=value;
        return true;
    }


    //取出棧頂元素
    public T pop() {
        if(isEmpty()) {
            return null;
        }
        T tmp=data[top];
        data[top]=null;
        top--;
        return tmp;
    }

    //============測試代碼============
    public static void main(String[] args) {
        StackOperation<String> stackOperation=new StackOperation<String>(10);
        stackOperation.push("AAA");
        stackOperation.push("BBB");
        stackOperation.push("CCC");
        stackOperation.push("DDD");
        stackOperation.push("EEE");
        stackOperation.push("XXX");
        stackOperation.push("YYY");
        stackOperation.push("ZZZ");


        while(!stackOperation.isEmpty())
        {
            System.out.println(stackOperation.pop());
        }
    }

}

基於鏈表實現棧

package com.company;

class Node<T>{
    protected T data;//數據
    private Node<T> next;//指向下一個節點的指針
    //初始化鏈表
    public Node(T data) {
        this.data=data;
    }
    //獲取下一個節點
    public Node<T> getNext(){
        return this.next;
    }
    //設置下一個節點
    public void setNext(Node<T> n) {
        this.next=n;
    }
    //獲取節點數據
    public T getData() {
        return this.data;
    }
    //設置節點數據
    public void setData(T d) {
        this.data=d;
    }

    @Override
    public String toString() {
        return "Node{" +
                "data=" + data +
                ", next=" + next +
                '}';
    }
}

public class NodeStack<T> {

    private Node<T> top=null;//棧頂

    public NodeStack() {
        this.top=null;
    }

    //判斷棧是否為空
    public boolean isEmpty() {
        if(top!=null) {
            return false;
        }
        return true;
    }

    //壓棧
    public boolean push(T value) {
        Node<T> node=new Node<T>(value);
        node.setNext(top);
        top=node;
        return true;
    }

    //出棧
    public T pop() {
        if(top==null) {
            return null;
        }
        T tmp=top.data;
        top=top.getNext();
        return tmp;
    }

    //取出棧頂的值
    public T peek() {
        if(isEmpty()) {
            return null;
        }
        return top.data;
    }




    public static void main(String[] args) {

        System.out.println("實例化一個棧:");
        NodeStack<String> ns=new NodeStack<String>();

        System.out.println("判斷是否為空:"+ns.isEmpty());

        System.out.println();

        System.out.println("開始壓棧:");
        ns.push("AAA");
        ns.push("BBB");
        ns.push("CCC");
        ns.push("DDD");

        System.out.println("判斷是否為空:"+ns.isEmpty());

        System.out.println();
        System.out.println("開始出棧:");

        System.out.println(ns.pop());
        System.out.println(ns.pop());
        System.out.println(ns.pop());
        System.out.println(ns.pop());

    }
}

基於數組實現隊列

package com.company;

public class QueueOperation<T> {

    private T data[];
    private int front=0;//隊列頭
    private int rear=0;//隊列尾
    private int size;//隊列大小

    public QueueOperation(int size) {
        this.size = size;
        data = (T[])new Object[size];
    }

    /**
     * 是否為空隊列
     * @return
     */
    public boolean isEmpty(){
        return  front == rear;
    }
    /**
     * 入隊
     * @param value
     */
    public void in(T value) throws Exception {
        if(rear == size){
            throw  new Exception("隊列已滿異常");
        }
        data[rear ++] = value;
    }

    /**
     * 出隊
     */
    public Object out() throws Exception {
        if(isEmpty()){
            throw  new Exception("空隊列異常");
        }
        T value = data[front];
        data[front++] = null;

        return value;
    }

    public static void main(String[] args) throws Exception {
        QueueOperation<String> queueOperation= new QueueOperation<>(10);
        queueOperation.in("AAA");
        queueOperation.in("BBB");
        queueOperation.in("CCC");
        queueOperation.in("DDD");
        queueOperation.in("EEE");
        queueOperation.in("XXX");
        queueOperation.in("YYY");
        queueOperation.in("ZZZ");

        while (!queueOperation.isEmpty())
        {
            System.out.println(queueOperation.out());
        }
    }
}

基於鏈表實現隊列

package com.company;

class Node<T> {
    // 存儲的數據
    private T data;
    // 下一個節點的引用
    private Node<T> next;

    public Node(T data) {
        this.data = data;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Node<T> getNext() {
        return next;
    }

    public void setNext(Node<T> next) {
        this.next = next;
    }

}

public class LinkQueue<T> {

    // 隊頭
    private Node<T> front;
    // 隊尾
    private Node<T> rear;
    // 元素個數
    private int size;

    /**
     * 初始化
     */
    public LinkQueue() {
        rear = front = null;
    }

    /**
     * 入隊
     * @param data
     */
    public void in(T data) {
        Node<T> node = new Node<T>(data);
        if (isEmputy()) {
            front = rear = node;
        } else {
            rear.setNext(node);
            rear = node;
        }

        size++;
    }

    /**
     * 出隊
     */
    public T out() {
        if (isEmputy()) {
            throw new RuntimeException("隊列為空");
        }

        Node<T> delete = front;
        front = delete.getNext();
        delete.setNext(null);;
        size--;

        if (size == 0) {
            // 刪除掉最后一個元素時,front值已經為null,但rear還是指向該節點,需要將rear置為null
            // 最后一個結點front和rear兩個引用都沒指向它,幫助GC處理該節點對象
            rear = front;
        }

        return (T) delete.getData();
    }

    /**
     * 判斷隊列是否為空
     * @return
     */
    public boolean isEmputy() {
        return (front == null && rear == null) ? true : false;
    }

    /**
     * 獲取隊列的元素個數
     * @return
     */
    public int size() {
        return this.size;
    }

    public static void main(String[] args) {
        LinkQueue<String> linkQueue = new LinkQueue<>();
        linkQueue.in("AAA");
        linkQueue.in("BBB");
        linkQueue.in("CCC");
        linkQueue.in("DDD");

        while (!linkQueue.isEmputy())
        {
            System.out.println(linkQueue.out());
        }

    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM