Java中兩種方法實現棧和隊列(面試)

學到LinkedList,上課時老師提了一下代碼實現棧和隊列,面試可能會用上,就碼了棧和隊列兩種實現方案。如有問題,希望指出。

一、棧

1.數組實現棧

/*
    利用數組的方式實現一個棧
    棧的特點:  存儲數據 -- 先進後出(就像彈夾)
    定義一個棧類:
    成員變量:
    1.存儲數據的數組
    2.棧容量
    3.棧頂索引
    成員方法:
    1.壓入數據方法
    2.取出數據方法

 */
public class Stack {

    private int[] data;
    private int size;
    private int stackTop = -1;  //記錄棧頂索引, 默認空, 索引-1

    //構造方法
    public Stack(int size) {
        this.size = size;
        this.data = new int[size];
    }

    public boolean push(int data) {     //壓棧方法
        if (stackTop + 1 == size) {
            System.out.println("棧已滿");
            return false;
        }
        this.data[++stackTop] = data;       //棧頂默認值爲-1,所以要先加後充當索引
        return true;
    }

    public int pop() throws Exception {   //出棧方法
        if (stackTop == -1) {
            throw new Exception("棧已空");
        }
        return data[stackTop--];    //返回數據後棧頂後移
    }
}

class StackDemo {
    public static void main(String[] args) throws Exception {

        Stack s = new Stack(5);
        //s.pop();  //報棧空

        //壓棧
        for (int i = 1; i <= 5; i++) {
            System.out.println(s.push(i));
        }
        //s.push(6);    //報棧滿

        //出棧
        for (int i = 0; i < 5; i++) {
            System.out.println(s.pop());
        }

    }
}

2.LinkedList實現棧

import java.util.LinkedList;

/*
    使用 LinkedList類 實現棧
    LinkedList類: 底層是鏈表  特點: 查詢慢, 增刪快

     特有功能:
     public void addFirst(E e): 在該列表開頭插入指定元素
     public void addLast(E e):  將指定元素追加到此列表的末尾

     public E getFirst():   返回此列表中的第一個元素
     public E getLast():    返回此列表中的最後一個元素

     public E removeFirst(): 從此列表中刪除並返回第一個元素
     public E removeLast():  從此列表中刪除並返回最後一個元素
 */
public class Stack {
    private LinkedList<Integer> list = new LinkedList<>();
    private int size;   //棧的大小

    //構造方法
    public Stack(int size) {
        this.size = size;
    }

    //壓棧方法
    public boolean push(int data) {
        if (list.size() == size) {
            System.out.println("棧已滿");
            return false;
        }
        list.addLast(data); //直接使用LinkedList的方法往後添加元素
        return true;
    }

    //出棧方法
    public int pop() throws Exception {
        if (list.size() == 0) {
            throw new Exception("棧已空");
        }
        return list.removeLast();   //刪除並返回最後一個元素
    }
}

class StackDemo {
    public static void main(String[] args) throws Exception {
        Stack s = new Stack(5);

        //s.pop();    //報棧空
        //壓棧
        for (int i = 1; i <= 5; i++) {
            s.push(i);
        }

        //s.push(6);  //報棧滿

        //出棧
        for (int i = 0; i < 5; i++) {
            System.out.println(s.pop());
        }
        //s.pop();    //報棧空
    }
}

二、隊列

1.數組實現隊列

/*
    數組實現隊列
    隊列的特點:  存儲數據 -- 先進先出(排隊)
    定義一個隊列類:
    成員變量:
    1.存儲數據的數組
    2.隊列容量
    3.隊列頭部索引
    4.隊列尾部索引
    成員方法:
    1.加入數據方法
    2.取出數據方法
 */
public class Queue {
    private int[] data;
    private int size;
    private int queueLast = -1;     //隊列頭索引
    private int queueFirst = -1;    //隊列尾索引

    //構造方法
    public Queue(int size) {
        this.size = size;
        this.data = new int[size];
    }

    //入列
    public boolean inQueue(int data) {
        if (queueLast + 1 == size) {
            System.out.println("隊列已滿");
            return false;
        }
        this.data[++queueLast] = data;
        return true;
    }

    //出列
    public int outQueue() throws Exception {
        if (queueFirst == queueLast) {
            throw new Exception("隊列已空");
        }
        return data[++queueFirst];
    }
}

class QueueDemo {
    public static void main(String[] args) throws Exception {
        Queue q = new Queue(5);

        //q.outQueue();     //報隊列空
        for (int i = 1; i <= 5; i++) {
            q.inQueue(i);
        }

        //q.inQueue(6);   //報隊列滿

        for (int i = 0; i < 5; i++) {
            System.out.println(q.outQueue());
        }

        //q.outQueue();   //報隊列空
    }
}

2.LinkedList實現隊列

import java.util.LinkedList;

/*
    LinkedList實現隊列
 */
public class Queue {
    private LinkedList<Integer> list = new LinkedList<>();
    private int size;

    //構造方法
    public Queue(int size) {
        this.size = size;
    }

    //入隊列方法
    public boolean inQueue(int data) {
        if (list.size() == size) {
            System.out.println("隊列已滿");
            return false;
        }
        list.addLast(data);    //從頭添加元素
        return true;
    }

    //出隊列方法
    public int outQueue() throws Exception {
        if (list.size() == 0) {
            throw new Exception("隊列已空");
        }
        return list.removeFirst();  //從頭刪除元素並返回元素
    }

}

class QueueDemo {
    public static void main(String[] args) throws Exception {
        Queue q = new Queue(5);

        //q.outQueue();   //報隊列空

        for (int i = 1; i <= 5; i++) {
            q.inQueue(i);
        }

        //q.inQueue(6);   //報隊列滿

        for (int i = 0; i < 5; i++) {
            System.out.println(q.outQueue());
        }

        //q.outQueue();       //報隊列空
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章