国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue)

這篇具有很好參考價值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

目錄

一,棧(Stack)

1.1 概念

1.2 棧的使用

1.3 棧的模擬實(shí)現(xiàn)

1.4 棧的應(yīng)用場景

1.5 棧,虛擬機(jī)棧,棧幀有什么區(qū)別?

二,隊列(Queue)

2.1 概念

2.2 隊列的使用

?2.3 隊列模擬實(shí)現(xiàn)

2.4 循環(huán)隊列

三,雙端隊列


一,棧(Stack)

1.1 概念

:一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和刪除操作的一端稱為棧
頂,另一端稱為棧底。棧中的數(shù)據(jù)元素遵守后進(jìn)先出LIFO(Last In First Out)的原則。
壓棧:棧的插入操作叫做進(jìn)棧/壓棧/入棧,入數(shù)據(jù)在棧頂。
出棧:棧的刪除操作叫做出棧。出數(shù)據(jù)在棧頂。
數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言
數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

1.2 棧的使用

方法
功能
Stack()
構(gòu)造一個空的棧
E push(E e)
e 入棧,并返回 e
E pop()
將棧頂元素出棧并返回
E peek()
獲取棧頂元素
int size()
獲取棧中有效元素個數(shù)
boolean empty()
檢測棧是否為空

public static void main(String[] args) {

Stack<Integer> s = new Stack();

s.push(1);

s.push(2);

s.push(3);

s.push(4);

System.out.println(s.size()); // 獲取棧中有效元素個數(shù)---> 4

System.out.println(s.peek()); // 獲取棧頂元素---> 4

s.pop(); // 4出棧,棧中剩余1 2 3,棧頂元素為3

System.out.println(s.pop()); // 3出棧,棧中剩余1 2 棧頂元素為3

if(s.empty()){

System.out.println("棧空");

}else{

System.out.println(s.size());

}

}

1.3 棧的模擬實(shí)現(xiàn)

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

從上圖中可以看到,Stack繼承了Vector,Vector和ArrayList類似,都是動態(tài)的順序表,不同的是Vector是線程安全的。
接口實(shí)現(xiàn):
public interface IStack {
    //入棧
    public int push(int val);
    //出棧
    public int pop();
    //獲取棧頂元素
    public int peek();
    //獲取棧內(nèi)有多少元素
    public int size();
    //檢查棧是否為空
    public boolean empty();
    //已滿擴(kuò)容
    public void full();
}
import java.util.Arrays;

public class MyStack implements IStack{
    int[] array;
    int size;
    static final int capacity = 3;
    public MyStack() {
        array = new int[capacity];
    }
    //入棧
    @Override
    public int push(int val) {
        if (isFull()) {
            full();
        }
        array[size] = val;
        size++;
        return val;
    }

    //出棧
    //先進(jìn)先出
    @Override
    public int pop() throws EmptyStackException{
        if (empty()) {
            throw new EmptyStackException("空棧異常");
        } else {
            int val = array[size-1];
            array[size-1] = 0;
            size--;
            return val;
        }
    }

    //獲取棧頂元素
    @Override
    public int peek() throws EmptyStackException{
        if (empty()) {
            throw new EmptyStackException("空棧異常");
        } else {
            return array[size - 1];
        }
    }

    //獲取棧內(nèi)有多少元素
    @Override
    public int size() {
        return size;
    }

    //檢查棧是否為空
    @Override
    public boolean empty() {
        return size == 0;
    }

    @Override
    public void full() {
        if (isFull()) {
            //擴(kuò)容
            array = Arrays.copyOf(array,array.length * 2);
        }
    }
    //檢查棧是否已滿
    private boolean isFull() {
        return size() == capacity;
    }

    //打印棧
    public void display() {
        for (int i = 0; i < size; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println(" ");
    }
}

1.4 棧的應(yīng)用場景

1.?括號匹配

思路:

我們先來看看括號不匹配的案例

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

我們只需要解決以上三種問題就能完成該題

于是我們想到了使用棧來解決

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

遍歷字符串,將左括號放進(jìn)棧中

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

又遇到左括號,繼續(xù)放進(jìn)棧中

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

此時遇到右括號

將棧頂括號與此時遍歷遇到的括號進(jìn)行比較

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

發(fā)現(xiàn)括號并不匹配,故返回false

而另外一種情況:

當(dāng)字符串遍歷完后棧為空,則返回true

public boolean isValid(String s) {
        Stack<Character> sta = new Stack<>();
        //遍歷字符串
        for (int i = 0; i < s.length(); i++) {
            //判斷是不是左括號
            char ch = s.charAt(i);
            if (ch == '{' || ch == '[' || ch == '(') {
                sta.push(ch);
            } else {
                //遇到右括號
                if (sta.empty()) {
                    return false;
                } else {
                    char ch2 = sta.peek();
                    if ((ch2 == '(' && ch == ')') || (ch2 == '[' && ch == ']') || (ch2 == '{' && ch == '}')) {
                        sta.pop();
                    } else {
                        return false;
                    }
                }
            }
        }
        if (!sta.empty()) {
            return false;
        }
        return true;
    }
}

2.逆波蘭表達(dá)式求值

首先我們要明白一點(diǎn),什么是逆波蘭表達(dá)式

逆波蘭表示法(Reverse Polish notation,RPN,或逆波蘭記法),是一種是由波蘭數(shù)學(xué)家揚(yáng)·武卡謝維奇1920年引入的數(shù)學(xué)表達(dá)式形式,在逆波蘭記法中,所有操作符置于操作數(shù)的后面,因此也被稱為后綴表示法。逆波蘭記法不需要括號來標(biāo)識操作符的優(yōu)先級。

這是一個我們常見的表達(dá)式:9+(3-1)*3+8/2,這是一個中綴表達(dá)式,而我們要將它轉(zhuǎn)換成一個不需要括號來識別優(yōu)先級的后綴表達(dá)式,該怎么做?

記住一點(diǎn):先加上括號再都去除括號

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

當(dāng)我們拿到后綴表達(dá)式后就能真正利用棧來進(jìn)行求值

首先計算機(jī)會遍歷字符串

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

當(dāng)遇到的是一個數(shù)字,就會把它放進(jìn)棧里

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

當(dāng)遇到運(yùn)算符,就會讓棧頂兩個元素對該運(yùn)算符進(jìn)行運(yùn)算

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

然后將運(yùn)算得到的這個數(shù)字再次放進(jìn)棧中

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

繼續(xù)遍歷

……

直到字符串遍歷完后棧中只剩下一個元素,該元素就是該表達(dá)式的運(yùn)算結(jié)果

根據(jù)以上,我們就能完成該題:

import java.util.Stack;

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for (String x:tokens) {
            if (!isOperator(x)) {
                stack.push(Integer.parseInt(x));
            } else {
                int num2 = stack.pop();
                int num1 = stack.pop();
                switch (x) {
                    case "+" :
                        stack.push(num1 + num2);
                        break;
                    case "-" :
                        stack.push(num1 - num2);
                        break;
                    case "*" :
                        stack.push(num1 * num2);
                        break;
                    case "/" :
                        stack.push(num1 / num2);
                        break;
                }
            }
        }
        return stack.pop();
    }
    private boolean isOperator(String s) {
        if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {
            return true;
        }
        return false;
    }
}

3.出棧入棧次序匹配

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

由上圖,預(yù)測第一個出棧的數(shù)組元素是4

遍歷入棧數(shù)組,4及4之前的元素的都入棧

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

棧頂元素4和出棧數(shù)組元素第一個相同,出棧

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

棧頂元素與出棧數(shù)組第二個元素不相同,入棧數(shù)組再次入棧

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

棧頂元素與出棧數(shù)組第二個元素相同,故出棧,此時入棧數(shù)組已遍歷完成,故只需判斷入棧數(shù)組次序與棧頂?shù)綏5自卮涡蚴欠裣嗤纯?/p>

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

import java.util.*;


public class Solution {
    /**
     * 代碼中的類名、方法名、參數(shù)名已經(jīng)指定,請勿修改,直接返回方法規(guī)定的值即可
     *
     *
     * @param pushV int整型一維數(shù)組
     * @param popV int整型一維數(shù)組
     * @return bool布爾型
     */
     public boolean IsPopOrder (int[] pushV, int[] popV) {
        // write code here
        Stack<Integer> stack = new Stack<>();
        int i = 0;
        for (int x:pushV) {
            stack.push(x);
            int tmp = stack.size();
            for (int j = 0; j < tmp; j++) {
                if (stack.peek() == popV[i]) {
                    stack.pop();
                    i++;
                } else {
                    break;
                }
            }
        }
        for (int j = 0; j < stack.size(); j++) {
            if (stack.pop() != popV[i]) {
                return false;
            } else {
                i++;
            }
        }
        return true;
    }
}

4.最小棧

?該題實(shí)現(xiàn)Stack各功能比較簡單,關(guān)鍵還是如何實(shí)現(xiàn)這個最小棧上

建立如下圖兩個棧

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

普通棧用來實(shí)現(xiàn)棧的各功能,最小棧用來存放每次入棧的最小值

具體怎么實(shí)現(xiàn)?

當(dāng)我們放入第一個元素時,在兩個棧當(dāng)中都放入,此時minStack中棧頂元素就是stack中的最小值

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

隨后放入第二個元素時間就與minStack中棧頂元素進(jìn)行比較,如果較小,就在兩個棧當(dāng)都放入

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

隨后第三個元素比minStack棧頂元素大,就只放入普通棧

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

按此思路

……

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

此時放入的元素和minStack棧頂元素相等,故兩個棧都放入

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

代碼實(shí)現(xiàn):

import java.util.Stack;

class MinStack {
     private Stack<Integer> stack;
     private Stack<Integer> minStack;
    public MinStack() {
        stack = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int val) {
        stack.push(val);
        if (minStack.empty()) {
            minStack.push(val);
        } else {
            if (val <= minStack.peek()) {
                minStack.push(val);
            }
        }
    }

    public void pop() {
        int val = minStack.peek();
        if (stack.peek() == val) {
            stack.pop();
            minStack.pop();
        } else {
            stack.pop();
        }
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
       if (!minStack.empty()) {
           return minStack.peek();
       } else {
           return -1;
       }
    }
}

1.5 棧,虛擬機(jī)棧,棧幀有什么區(qū)別?

數(shù)據(jù)結(jié)構(gòu)
虛擬機(jī)棧 JVM劃分的一塊內(nèi)存
棧幀 調(diào)試方法時會在虛擬機(jī)當(dāng)中給這個方法開辟一塊內(nèi)存

二,隊列(Queue)

2.1 概念

隊列:只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進(jìn)先出FIFO(First In First Out) 入隊列:進(jìn)行插入操作的一端稱為隊尾(Tail/Rear) 出隊列:進(jìn)行刪除操作的一端稱為隊頭(Head/Front)
數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

2.2 隊列的使用

在Java中,Queue是個接口,底層是通過鏈表實(shí)現(xiàn)的。?

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

方法
功能
boolean offer(E e)
入隊列
E poll()
出隊列
peek()
獲取隊頭元素
int size()
獲取隊列中有效元素個數(shù)
boolean isEmpty()
檢測隊列是否為空
注意:Queue是個接口,在實(shí)例化時必須實(shí)例化LinkedList的對象,因?yàn)長inkedList實(shí)現(xiàn)了Queue接口。
public static void main ( String [] args ) {
Queue < Integer > q = new LinkedList <> ();
q . offffer ( 1 );
q . offffer ( 2 );
q . offffer ( 3 );
q . offffer ( 4 );
q . offffer ( 5 ); // 從隊尾入隊列
System . out . println ( q . size ());
System . out . println ( q . peek ()); // 獲取隊頭元素
q . poll ();
System . out . println ( q . poll ()); // 從隊頭出隊列,并將刪除的元素返回
if ( q . isEmpty ()){
System . out . println ( " 隊列空 " );
} else {
System . out . println ( q . size ());
}
}

?2.3 隊列模擬實(shí)現(xiàn)

隊列中既然可以存儲元素,那底層肯定要有能夠保存元素的空間,通過前面線性表的學(xué)習(xí)了解到常見的空間類型有兩種:順序結(jié)構(gòu) 和 鏈?zhǔn)浇Y(jié)構(gòu)。
思考:隊列的實(shí)現(xiàn)使用順序結(jié)構(gòu)還是鏈?zhǔn)浇Y(jié)構(gòu)好?

?數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

class Queue {
    //雙向鏈表節(jié)點(diǎn)
    public static class ListNode {
        ListNode prev;
        ListNode next;
        int val;
        ListNode(int val) {
            this.val = val;
        }
    }
    ListNode first; // 隊頭
    ListNode last; // 隊尾
    int size = 0;
    // 入隊列---向雙向鏈表位置插入新節(jié)點(diǎn)
    public void offer(int e){
        ListNode node = new ListNode(e);
        if (first == null) {
            first = node;
        } else {
            last.next = node;
        }
        last = node;
        size++;
    }

    // 出隊列---將雙向鏈表第一個節(jié)點(diǎn)刪除掉
    public int poll() {

        // 1. 隊列為空
        if (first == null) {
            return -1;
        }

        int val = first.val;
        // 2. 隊列中只有一個元素----鏈表中只有一個節(jié)點(diǎn)---直接刪除
        if (first == last) {
            first = null;
            last = null;
        } else {
            // 3. 隊列中有多個元素---鏈表中有多個節(jié)點(diǎn)----將第一個節(jié)點(diǎn)刪除
            first = first.next;
            first.prev.next = null;
            first.prev = null;
        }
        size--;
        return val;
    }

    // 獲取隊頭元素---獲取鏈表中第一個節(jié)點(diǎn)的值域
    public int peek() {
        if (first == null) {
            return -1;
        }
        return first.val;
    }

    public int getSize() {
        return size;
    }

    public boolean isEmpty(){ 
        return first == null; 
    }
}

2.4 循環(huán)隊列

上列代碼是由雙向鏈表來進(jìn)行實(shí)現(xiàn)的,那我們可不可以用線性表(數(shù)組)來實(shí)現(xiàn)呢?
實(shí)際中我們有時還會使用一種隊列叫循環(huán)隊列。如操作系統(tǒng)課程講解生產(chǎn)者消費(fèi)者模型時可以就會使用循環(huán)隊列。環(huán)形隊列通常使用數(shù)組實(shí)現(xiàn)。
數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言
數(shù)組下標(biāo)循環(huán)的小技巧
1. 下標(biāo)最后再往后 (offset 小于 array.length): index = (index + offset) % array.length

?數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

?2. 下標(biāo)最前再往前(offset 小于 array.length): index = (index + array.length - offset) % array.length

?數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

如何區(qū)分空與滿

1. 通過添加 size 屬性記錄
2. 保留一個位置
3. 使用標(biāo)記

?關(guān)于方法2:

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

設(shè)計循環(huán)隊列

代碼示例:

class MyCircularQueue {
    public int[] elem;
    public int front;//隊頭
    public int rare;//隊尾

    public MyCircularQueue(int k) {
       elem = new int[k + 1];
    }

    public boolean enQueue(int value) {
        if (isFull()) {
            return false;
        }
        elem[rare] = value;
        rare = (rare + 1) % elem.length;
        return true;
    }

    public boolean deQueue() {
        if (isEmpty()) {
            return false;
        }
        elem[front] = 0;
        front = (front + 1) % elem.length;
        return true;
    }

    public int Front() {
        if (isEmpty()) {
            return -1;
        }
        return elem[front];
    }

    public int Rear() {
        if (isEmpty()) {
            return -1;
        }
        int index = (rare == 0) ? elem.length - 1 : rare - 1;
        return elem[index];
    }

    public boolean isEmpty() {
        return front == rare;
    }

    public boolean isFull() {
        return (rare + 1) % elem.length == front;
    }
}

?

三,雙端隊列

雙端隊列( deque )是指允許兩端都可以進(jìn)行入隊和出隊操作的隊列, deque “double ended queue” 的簡稱。那就說明元素可以從隊頭出隊和入隊,也可以從隊尾出隊和入隊。

?數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

Deque是一個接口,使用時必須創(chuàng)建LinkedList的對象。?

數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue),數(shù)據(jù)結(jié)構(gòu)從入門到入土,數(shù)據(jù)結(jié)構(gòu),java,開發(fā)語言

?在實(shí)際工程中,使用Deque接口是比較多的,棧和隊列均可以使用該接口

Deque<Integer> stack = new ArrayDeque<>();// 雙端隊列的線性實(shí)現(xiàn)
Deque<Integer> queue = new LinkedList<>();// 雙端隊列的鏈?zhǔn)綄?shí)現(xiàn)

完。文章來源地址http://www.zghlxwxcb.cn/news/detail-786372.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)入門到入土——棧(Stack)和隊列(Queue)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu):隊列Queue詳解

    數(shù)據(jù)結(jié)構(gòu):隊列Queue詳解

    隊列 :只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表。進(jìn)行插入操作的一端稱為 隊尾 ,刪除操作的一端稱 隊頭 。 入隊列 :進(jìn)行插入操作的一端稱為 隊尾 。 出隊列 :進(jìn)行刪除操作的一端稱為 隊頭 。 在 Java 中, Queue是個接口,底層是通過鏈表

    2024年02月11日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】 隊列(Queue)與隊列的模擬實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】 隊列(Queue)與隊列的模擬實(shí)現(xiàn)

    隊列 :只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊列具有==先進(jìn)先出FIFO(FirstIn First Out) ==入隊列: 進(jìn)行插入操作的一端稱為 隊尾(Tail/Rear) 出隊列: 進(jìn)行刪除操作的一端稱為 隊頭(Head/Front) 在Java中, Queue是個接口,底層是通過鏈表實(shí)現(xiàn)

    2024年02月11日
    瀏覽(14)
  • [數(shù)據(jù)結(jié)構(gòu) -- C語言] 隊列(Queue)

    [數(shù)據(jù)結(jié)構(gòu) -- C語言] 隊列(Queue)

    目錄 1、隊列 1.1 隊列的概念及結(jié)構(gòu) 2、隊列的實(shí)現(xiàn) 2.1 接口 3、接口的實(shí)現(xiàn) 3.1 初始化隊列 3.2 隊尾入隊列 分析: 3.3 隊頭出隊列 分析: 3.4 獲取隊列頭部元素 3.5 獲取隊列尾部元素 3.6 獲取隊列中有效元素個數(shù) 3.7 檢測隊列是否為空 3.7.1 int 類型判空 3.7.2 bool 類型判空 3.8 銷毀隊

    2024年02月07日
    瀏覽(17)
  • 【數(shù)據(jù)結(jié)構(gòu)】隊列(Queue)的實(shí)現(xiàn) -- 詳解

    【數(shù)據(jù)結(jié)構(gòu)】隊列(Queue)的實(shí)現(xiàn) -- 詳解

    1、概念 隊列 :只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊列具有 先進(jìn)先出 FIFO(First In First Out)。 入隊列 :進(jìn)行 插入 操作的一端稱為 隊尾 。 出隊列 :進(jìn)行 刪除 操作的一端稱為 隊頭 。 2、結(jié)構(gòu) (1)隊列的順序存儲結(jié)構(gòu) 入隊 ,不需要

    2024年02月15日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)入門到入土——鏈表(1)

    數(shù)據(jù)結(jié)構(gòu)入門到入土——鏈表(1)

    目錄 一,順序表表/ArrayList的缺陷 二,鏈表 三,鏈表的實(shí)現(xiàn) 四,與鏈表有關(guān)的題目練習(xí)(1) 1.刪除鏈表中等于給定值 val 的所有節(jié)點(diǎn) 2.反轉(zhuǎn)一個單鏈表 3.給定一個帶有頭結(jié)點(diǎn) head 的非空單鏈表,返回鏈表的中間結(jié)點(diǎn)。如果有兩個中間結(jié)點(diǎn),則返回第二個中間結(jié)點(diǎn) 4.輸入一個

    2024年02月02日
    瀏覽(17)
  • Java 數(shù)據(jù)結(jié)構(gòu)之隊列(Queue)詳解

    Java 數(shù)據(jù)結(jié)構(gòu)之隊列(Queue)詳解

    目錄 1、在Java中有哪些常見的隊列? 2、Queue 接口分析 3、Deque 接口分析 4、PriorityQueue 的實(shí)現(xiàn)原理詳解 5、使用Java數(shù)組實(shí)現(xiàn)隊列的簡單示例 1、在Java中有哪些常見的隊列? ????????在Java中,有一些常見的隊列實(shí)現(xiàn)。下面是其中一些的列舉: //隊列也是一種線性的數(shù)據(jù)結(jié)構(gòu)

    2024年02月15日
    瀏覽(23)
  • 【Golang】實(shí)現(xiàn)簡單隊列(Queue)數(shù)據(jù)結(jié)構(gòu)

    ?在計算機(jī)科學(xué)中,隊列是一種特殊的線性數(shù)據(jù)結(jié)構(gòu),它遵循FIFO(先進(jìn)先出)原則。隊列中的元素只能從一端(稱為隊尾或后端)添加,并且只能從另一端(稱為隊頭或前端)移除。這種特性使得隊列在許多算法和數(shù)據(jù)結(jié)構(gòu)中都有廣泛的應(yīng)用,例如操作系統(tǒng)中的任務(wù)調(diào)度、網(wǎng)

    2024年01月19日
    瀏覽(25)
  • 隊列(Queue):先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu)

    隊列(Queue):先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu)

    隊列是一種基本的數(shù)據(jù)結(jié)構(gòu),用于在計算機(jī)科學(xué)和編程中管理數(shù)據(jù)的存儲和訪問。隊列遵循先進(jìn)先出(First In, First Out,F(xiàn)IFO)原則,即最早入隊的元素首先出隊。這種數(shù)據(jù)結(jié)構(gòu)模擬了物理世界中的隊列,如排隊等待服務(wù)的人。 在本篇博客中,我們將詳細(xì)介紹隊列的概念、用途

    2024年02月05日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】7、隊列(Queue)的實(shí)現(xiàn)【用棧實(shí)現(xiàn)隊列】

    【數(shù)據(jù)結(jié)構(gòu)與算法】7、隊列(Queue)的實(shí)現(xiàn)【用棧實(shí)現(xiàn)隊列】

    ?? 隊列 (Queue)是一種特殊的 線性表 , 只能在頭尾兩端進(jìn)行操作 ?? 隊尾(rear):只能從 隊尾添加 元素,一般叫做 enQueue , 入隊 ?? 隊頭(front):只能從 隊頭移除 元素,一般叫做 deQueue , 出隊 ?? 先進(jìn)先出 的原則, F irst I n F irst O ut, FIFO ?? 隊列內(nèi)部的實(shí)現(xiàn)可

    2024年02月12日
    瀏覽(25)
  • Java學(xué)數(shù)據(jù)結(jié)構(gòu)(1)——抽象數(shù)據(jù)類型ADT & 表List、棧Stack和隊列Qeue

    Java學(xué)數(shù)據(jù)結(jié)構(gòu)(1)——抽象數(shù)據(jù)類型ADT & 表List、棧Stack和隊列Qeue

    1.抽象數(shù)據(jù)類型Abstract data type的概念; 2.表list,java中的ArrayList和linkedlist以及vector的分析; 3.棧stack的分析以及應(yīng)用; 4.隊列queue的理解,以及rabbitmq的應(yīng)用; 抽象數(shù)據(jù)類型(abstract data type,ADT)是帶有一組操作的一些對象的集合。抽象數(shù)據(jù)類型是數(shù)學(xué)的抽象;在ADT的定義中沒有地

    2024年02月11日
    瀏覽(61)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包