成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

我理解的數(shù)據(jù)結(jié)構(gòu)(二)—— 棧(Stack)

lcodecorex / 2412人閱讀

摘要:以數(shù)組的最后一個(gè)元素當(dāng)成棧頂元素。解題思路首先,我們可以把左括號直接壓入棧,不論是小括號中括號還是大括號。拿出棧頂元素,如果與之右括號不匹配,則返回。如果字符串比較完成,沒有返回,則判斷棧是否為空。

我理解的數(shù)據(jù)結(jié)構(gòu)(二)—— 棧(Stack) 一、棧基礎(chǔ)

棧是一種線性結(jié)構(gòu)

相比較數(shù)組,棧對應(yīng)的操作是數(shù)組的子集

只能從一端添加元素,也只能從同一端取出元素,這一端稱為棧頂

棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),LIFO(Last In First Out)

二、棧的應(yīng)用

Undo操作(撤銷)

程序調(diào)用所使用的系統(tǒng)棧

三、棧的實(shí)現(xiàn)
其實(shí),實(shí)現(xiàn)一個(gè)棧結(jié)構(gòu)非常簡單,我們只需要復(fù)用上一節(jié)我們自己封裝的數(shù)組就可以快速的實(shí)現(xiàn)一個(gè)棧的創(chuàng)建。
以數(shù)組的最后一個(gè)元素當(dāng)成棧頂元素。
1. 首先,我們先創(chuàng)建一個(gè)棧的借口,里面聲明我們需要實(shí)現(xiàn)的方法:
public interface Stack {
    boolean isEmpty();
    int getSize();
    // 移除棧頂元素
    E pop();
    // 查看棧頂元素
    E peek();
    // 壓入棧
    void push(E ele);
}

注:這里我們有一個(gè)peek方法,就是查看棧頂元素,所以我們需要給我們自己封裝的數(shù)組類添加一個(gè)查看最后一個(gè)元素的方法:

// 獲取最后一個(gè)元素
public E getLast() {
    return get(size - 1);
}
2. 封裝我們自己的棧
public class ArrayStack implements Stack {

    private ArrayNew array;

    public ArrayStack(int capacity) {
        array = new ArrayNew<>(capacity);
    }

    public ArrayStack() {
        array = new ArrayNew<>();
    }

    public int getCapacity() {
        return array.getCapacity();
    }

    @Override
    public int getSize() {
        return array.getSize();
    }

    @Override
    public boolean isEmpty() {
        return array.isEmpty();
    }

    @Override
    public void push(E ele) {
        array.addLast(ele);
    }

    @Override
    public E pop() {
        return array.removeLast();
    }

    @Override
    public E peek() {
        return array.getLast();
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();

        res.append("Stack: [");
        for (int i = 0; i < getSize(); i++) {
            res.append(array.get(i));
            if (getSize() - 1 != i) {
                res.append(", ");
            }
        }
        res.append("] top");
        return res.toString();
    }

}

注:其中的ArrayNew即是我們在上一節(jié)自己封裝的數(shù)組類,不知道的同學(xué)可以去查看:
我理解的數(shù)據(jù)結(jié)構(gòu)(一)—— 不要小看了數(shù)組

因?yàn)槲以?b>ArrayNew中已經(jīng)實(shí)現(xiàn)了動(dòng)態(tài)數(shù)組,所以不用考慮棧長度的問題,這樣我們就自己封裝了一個(gè)棧(注釋在Stack接口中和ArrayNew類中足夠詳細(xì))。
四、用棧去解決《有效的括號》
這是一道leetcode上,編號為20的題目,具體題目描述如下:
給定一個(gè)只包括 "(",")","{","}","[","]" 的字符串,判斷字符串是否有效。

有效字符串需滿足:
    1.左括號必須用相同類型的右括號閉合。
    2.左括號必須以正確的順序閉合。
注意空字符串可被認(rèn)為是有效字符串。

解題思路

首先,我們可以把左括號直接壓入棧,不論是小括號、中括號還是大括號。

如果拿到的是右括號,則需要做匹配判斷。

拿出棧頂元素,如果與之右括號匹配,則pop出棧頂元素。

拿出棧頂元素,如果與之右括號不匹配,則返回false。

如果字符串比較完成,沒有返回false,則判斷棧是否為空。

為空,返回true,括號匹配成功

不為空,返回false

解題代碼如下:
public boolean isValid(String s) {

    ArrayStack stack = new ArrayStack<>();

    for (int i = 0; i < s.length(); i++) {

        char c = s.charAt(i);

        // 左括號直接壓入棧
        if (c == "(" || c == "[" || c == "{") {
            stack.push(c);
        } else {

            if (stack.isEmpty()) {
                return false;
            }

            char topChar = stack.pop();
            if (c == ")" && topChar != "(") {
                return false;
            }
            if (c == "]" && topChar != "[") {
                return false;
            }
            if (c == "}" && topChar != "{") {
                return false;
            }
        }

    }

    return stack.isEmpty();
}
五、棧的復(fù)雜度分析
方法 復(fù)雜度
push O(1) 均攤
pop O(1) 均攤
peek O(1)
getSize O(1)
isEmpty O(1)
因?yàn)闂5臅r(shí)間復(fù)雜度都是O(1),所以棧的性能是很高的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29276.html

相關(guān)文章

  • 理解數(shù)據(jù)結(jié)構(gòu))—— Stack

    摘要:以數(shù)組的最后一個(gè)元素當(dāng)成棧頂元素。解題思路首先,我們可以把左括號直接壓入棧,不論是小括號中括號還是大括號。拿出棧頂元素,如果與之右括號不匹配,則返回。如果字符串比較完成,沒有返回,則判斷棧是否為空。 我理解的數(shù)據(jù)結(jié)構(gòu)(二)—— 棧(Stack) 一、棧基礎(chǔ) 棧是一種線性結(jié)構(gòu) 相比較數(shù)組,棧對應(yīng)的操作是數(shù)組的子集 只能從一端添加元素,也只能從同一端取出元素,這一端稱為棧頂 棧是一種后...

    Charlie_Jade 評論0 收藏0
  • 【Java實(shí)現(xiàn)】和隊(duì)列就是這么簡單

    摘要:一前言上一篇已經(jīng)講過了鏈表實(shí)現(xiàn)單向鏈表了,它跟數(shù)組都是線性結(jié)構(gòu)的基礎(chǔ),本文主要講解線性結(jié)構(gòu)的應(yīng)用棧和隊(duì)列如果寫錯(cuò)的地方希望大家能夠多多體諒并指正哦,如果有更好的理解的方式也希望能夠在評論下留言,讓大家學(xué)習(xí)學(xué)習(xí)二數(shù)據(jù)結(jié)構(gòu)棧就是這么簡單數(shù)據(jù)結(jié)構(gòu) 一、前言 上一篇已經(jīng)講過了鏈表【Java實(shí)現(xiàn)單向鏈表】了,它跟數(shù)組都是線性結(jié)構(gòu)的基礎(chǔ),本文主要講解線性結(jié)構(gòu)的應(yīng)用:棧和隊(duì)列 如果寫錯(cuò)的地方希望大家...

    Ethan815 評論0 收藏0
  • 應(yīng)用——用JavaScript描述數(shù)據(jù)結(jié)構(gòu)

    摘要:一實(shí)現(xiàn)一個(gè)棧類基于堆棧的特性,可以用數(shù)組做線性表進(jìn)行存儲(chǔ)。出棧出棧同樣是利用數(shù)組的方法,在數(shù)組尾部推出數(shù)據(jù)。聚合最后,將所有功能聚合后,如下所示,一個(gè)堆棧的數(shù)據(jù)結(jié)構(gòu)就搞定了。堆棧的經(jīng)典算法應(yīng)用,首推就是漢諾塔。 棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。其限制是僅允許在表的一端進(jìn)行插入和刪除運(yùn)算。這一端被稱為棧頂,相對地,把另一端稱為棧底。 一、實(shí)現(xiàn)一個(gè)棧類Stack 基于堆...

    Hydrogen 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<