溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

發(fā)布時間:2022-01-25 09:25:59 來源:億速云 閱讀:124 作者:柒染 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(guān)怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

    一,棧

    1,概念

    在我們軟件應(yīng)用 ,棧這種后進(jìn)先出數(shù)據(jù)結(jié)構(gòu)的應(yīng)用是非常普遍的。比如你用瀏 覽器上網(wǎng)時不管什么瀏覽器都有 個"后退"鍵,你點(diǎn)擊后可以接訪問順序的逆序加載瀏覽過的網(wǎng)頁。

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

    很多類似的軟件,比如 Word Photoshop 等文檔或圖像編 軟件中 都有撤銷 )的操作,也是用棧這種方式來實(shí)現(xiàn)的,當(dāng)然不同的軟件具體實(shí)現(xiàn)會有很大差異,不過原理其實(shí)都是一樣的。

    棧( stack )是限定僅在表尾進(jìn)行插入和刪除的線性表

    棧:一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和刪除操作的一端稱為棧 頂,另一端稱為棧底。棧中的數(shù)據(jù)元素遵守后進(jìn)先出LIFO(Last In First Out)的原則。

    2,棧的操作

    壓棧:棧的插入操作叫做進(jìn)棧/壓棧/入棧,入數(shù)據(jù)在棧頂。

    出棧:棧的刪除操作叫做出棧。出數(shù)據(jù)在棧頂。

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

    3,棧的實(shí)現(xiàn)

    ①入棧

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

     public static void main(String[] args) {
            Stack<Integer> stack = new Stack<>();
            stack.push(1);
            stack.push(2);
            stack.push(3);
            stack.push(4);
            int ret = stack.push(4);
            System.out.println(ret);
        }

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

    ②出棧
      public static void main(String[] args) {
            Stack<Integer> stack = new Stack<>();
            stack.push(1);
            stack.push(2);
            stack.push(3);
            int ret1 = stack.pop();
            int ret2 = stack.pop();
            System.out.println(ret1);
            System.out.println(ret2);
        }

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

    ③獲取棧頂元素
     public static void main(String[] args) {
            Stack<Integer> stack = new Stack<>();
            stack.push(1);
            stack.push(2);
            stack.push(3);
            int ret1 = stack.pop();
            int ret2 = stack.pop();
            int ret3 = stack.peek();
            System.out.println(ret1);
            System.out.println(ret2);
            System.out.println(ret3);
        }

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

    ④判斷棧是否為空

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

      public static void main(String[] args) {
            Stack<Integer> stack = new Stack<>();
            stack.push(1);
            stack.push(2);
            stack.push(3);
            int ret1 = stack.pop();
            int ret2 = stack.pop();
            int ret3 = stack.peek();
            System.out.println(ret1);
            System.out.println(ret2);
            System.out.println(ret3);
            stack.pop();
            boolean flag = stack.empty();
            System.out.println(flag);
        }

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

     4,實(shí)現(xiàn)mystack

    public class MyStack<T> {
        private T[] elem;//數(shù)組
        private int top;//當(dāng)前可以存放數(shù)據(jù)元素的下標(biāo)-》棧頂指針
     
        public MyStack() {
            this.elem = (T[])new Object[10];
        }
     
        /**
         * 入棧操作
         * @param item 入棧的元素
         */
        public void push(T item) {
            //1、判斷當(dāng)前棧是否是滿的
            if(isFull()){
                this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
            }
            //2、elem[top] = item  top++;
            this.elem[this.top++] = item;
        }
     
        public boolean isFull(){
            return this.elem.length == this.top;
        }
     
        /**
         * 出棧
         * @return 出棧的元素
         */
        public T pop() {
            if(empty()) {
                throw new UnsupportedOperationException("棧為空!");
            }
            T ret = this.elem[this.top-1];
            this.top--;//真正的改變了top的值
            return ret;
        }
     
        /**
         * 得到棧頂元素,但是不刪除
         * @return
         */
        public T peek() {
            if(empty()) {
                throw new UnsupportedOperationException("棧為空!");
            }
            //this.top--;//真正的改變了top的值
            return this.elem[this.top-1];
        }
        public boolean empty(){
            return this.top == 0;
        }
    }
    public static void main(String[] args) {
            MyStack<Integer> myStack = new MyStack<>();
            myStack.push(1);
            myStack.push(2);
            myStack.push(3);
            System.out.println(myStack.peek());
            System.out.println(myStack.pop());
            System.out.println(myStack.pop());
            System.out.println(myStack.pop());
            System.out.println(myStack.empty());
            System.out.println("============================");
            MyStack<String> myStack2 = new MyStack<>();
            myStack2.push("hello");
            myStack2.push("word");
            myStack2.push("thank");
            System.out.println(myStack2.peek());
            System.out.println(myStack2.pop());
            System.out.println(myStack2.pop());
            System.out.println(myStack2.pop());
            System.out.println(myStack2.empty());
     
        }

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

    二,隊(duì)列

    1,概念

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

    像移動、聯(lián)通、電信等客服電話,客服人員與客戶相比總是少數(shù),在所有的客服人員都占線的情況下,客戶會被要求等待,直到有某個客服人員空下來,才能讓最先等待的客戶接通電話。這里也是將所有當(dāng)前撥打客服電話的客戶進(jìn)行了排隊(duì)處理。

    操作系統(tǒng)和客服系統(tǒng)中,都是應(yīng)用了種數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)剛才提到的先進(jìn)先出的排隊(duì)功能,這就是隊(duì)列。

    隊(duì)列(queue) 是只允許在一端進(jìn)行插入操作,而在另一端進(jìn)行刪除操作的線性表

    隊(duì)列:只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIFO(First In First Out) 入隊(duì)列:進(jìn)行插入操作的一端稱為隊(duì)尾(Tail/Rear) 出隊(duì)列:進(jìn)行刪除操作的一端稱為隊(duì)頭 (Head/Front)

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

    2,隊(duì)列的實(shí)現(xiàn)

    ①入隊(duì)
     public static void main(String[] args) {
            Deque<Integer> queue = new LinkedList<>();
            queue.offer(1);
            queue.offer(2);
            queue.offer(3);
            queue.offer(4);
            
        }
    ②出隊(duì)
      public static void main(String[] args) {
            Deque<Integer> queue = new LinkedList<>();
            queue.offer(1);
            queue.offer(2);
            queue.offer(3);
            queue.offer(4);
            System.out.println(queue.poll());
            System.out.println(queue.poll());
     
        }

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

    ③獲取隊(duì)首元素
    public static void main(String[] args) {
            Deque<Integer> queue = new LinkedList<>();
            queue.offer(1);
            queue.offer(2);
            queue.offer(3);
            queue.offer(4);
            System.out.println(queue.poll());
            System.out.println(queue.poll());
            System.out.println("-----------------");
            System.out.println(queue.peek());
        }

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

    3,實(shí)現(xiàn)myqueue

    class Node {
        private int val;
        private Node next;
        public int getVal() {
            return val;
        }
        public void setVal(int val) {
            this.val = val;
        }
        public Node getNext() {
            return next;
        }
        public void setNext(Node next) {
            this.next = next;
        }
        public Node(int val) {
            this.val = val;
        }
    }
    public class MyQueue {
        private Node first;
        private Node last;
        //入隊(duì)
        public void offer(int val) {
            //尾插法  需要判斷是不是第一次插入
            Node node = new Node(val);
            if(this.first == null) {
                this.first = node;
                this.last = node;
            }else {
                this.last.setNext(node);//last.next = node;
                this.last = node;
            }
        }
        //出隊(duì)
        public int poll() {
            //1判斷是否為空的
            if(isEmpty()) {
                throw new UnsupportedOperationException("隊(duì)列為空!");
            }
            //this.first = this.first.next;
            int ret = this.first.getVal();
            this.first = this.first.getNext();
            return ret;
        }
        //得到隊(duì)頭元素但是不刪除
        public int peek() {
            //不要移動first
            if(isEmpty()) {
                throw new UnsupportedOperationException("隊(duì)列為空!");
            }
            return this.first.getVal();
        }
        //隊(duì)列是否為空
        public boolean isEmpty() {
            return this.first == null;
        }
    }
     public static void main(String[] args) {
            MyQueue myQueue = new MyQueue();
            myQueue.offer(1);
            myQueue.offer(2);
            myQueue.offer(3);
            System.out.println(myQueue.peek());
            System.out.println(myQueue.poll());
            System.out.println(myQueue.poll());
            System.out.println(myQueue.poll());
            System.out.println(myQueue.isEmpty());
           
        }

    怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列

    看完上述內(nèi)容,你們對怎么分析Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI