15.第20章:線性表、棧怎栽、隊(duì)列丽猬、優(yōu)先隊(duì)列

java框架支持兩種類型的容器:

  • 為了存儲(chǔ)一個(gè)元素集合,簡(jiǎn)稱合集
  • 為了存儲(chǔ)鍵/值對(duì)熏瞄,稱為映射表

1.集合

  • Set用于存儲(chǔ)一組不重復(fù)的元素
  • List用于存儲(chǔ)一個(gè)有序元素集合
  • Stack用于存儲(chǔ)后進(jìn)先出方式處理的對(duì)象
  • Queue用于存儲(chǔ)采用先進(jìn)先出方式處理的對(duì)象
  • Priority Queue用于存儲(chǔ)按照優(yōu)先級(jí)順序處理的對(duì)象


collection接口:

collection接口

2.迭代器

Iterator是一種經(jīng)典的設(shè)計(jì)模式脚祟,用于在不需要暴露數(shù)據(jù)是如何保存在數(shù)據(jù)結(jié)構(gòu)的細(xì)節(jié)的情況下,來(lái)遍歷一個(gè)數(shù)據(jù)結(jié)構(gòu)强饮。
Collection接口繼承自Iterator接口,Iterator接口中Iterator()方法返回一個(gè)Iterator的實(shí)例由桌。



3.線性表 List

List接口繼承自Collection接口,定義了一個(gè)用于順序存儲(chǔ)元素的集合⌒心可以使用ArrayList(數(shù)組線性表)和LinkedList(鏈表)來(lái)創(chuàng)建一個(gè)線性表铭乾。

  • List接口通用方法

方法listIterator()會(huì)返回ListIterator的一個(gè)實(shí)例。ListIterator接口繼承了Iterator接口娃循,以增加對(duì)線性表的雙向遍歷能力炕檩。


ListIterator接口可以雙向遍歷線性表
  • 數(shù)組線性表類ArrayList和鏈表類LinkedList

ArrayList和LinkedList是實(shí)現(xiàn)List接口的兩個(gè)具體類。
1)ArrayList
ArrayList用數(shù)組存儲(chǔ)元素捌斧,這個(gè)數(shù)組是動(dòng)態(tài)創(chuàng)建的笛质。如果元素個(gè)數(shù)超過了數(shù)組的容量,就創(chuàng)建一個(gè)更大的新數(shù)組捞蚂,并將當(dāng)前數(shù)組中所有元素都復(fù)制到新數(shù)組中妇押。



2)LinkedList
LinkedList在一個(gè)鏈表中存儲(chǔ)元素。



比較:
如果需要通過下標(biāo)隨機(jī)訪問元素姓迅,而不會(huì)在線性表起始末尾位置插入或刪除敲霍,使用ArrayList效率高。
如果需要在線性表起始末尾位置插入刪除元素丁存,選用LinkedList效率高肩杈。
public class text1_線性表 {
    public static void main(String[] args ){
        //ArrayList
        List<Integer> arrayList=new ArrayList();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(0,10);
        arrayList.add(3,30);
        System.out.println(arrayList);




        //linkedList
        LinkedList<Object> linkedList=new LinkedList();
        linkedList.add("red");
        linkedList.add(1);
        linkedList.add(2);
        linkedList.add(3);
        linkedList.addFirst("yellow");
        linkedList.removeLast();
        System.out.println(linkedList);
        //從前向后遍歷
        ListIterator listIterator=linkedList.listIterator();
        while (listIterator.hasNext()){
            System.out.print(listIterator.next()+" ");
        }
        System.out.println();
        //從后向前遍歷
        listIterator=linkedList.listIterator(linkedList.size());
        while (listIterator.hasPrevious()){
            System.out.print(listIterator.previous()+" ");
        }
    }
}


4.Collections類

Collections類包含了執(zhí)行合集和線性表中通用操作的靜態(tài)方法。


5.Vector和棧

  • Vector

Vector是AbstractList的子類柱嫌,Stack是Vector的子類锋恬。
Vector是同步的,如果不需要同步编丘,建議使用ArrayList效率高


圖片.png
  • stack類

6.隊(duì)列和優(yōu)先隊(duì)列

  • 隊(duì)列(queue)是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)与学。元素被追加到隊(duì)列末尾,然后從隊(duì)列頭部出去嘉抓。


  • 雙端隊(duì)列(Deque)索守,繼承自Queue接口,增加了如下方法:addFirst(e)抑片、removeFirst()卵佛、addLast(e)、removeLast()敞斋、getFirst()和getLast()這些從隊(duì)列兩端插入和刪除的方法截汪。
  • 可以使用LinkedList創(chuàng)建一個(gè)隊(duì)列。
public class text2_隊(duì)列 {
    public static void main(String[] args){
        //LinkedList實(shí)現(xiàn)了List和Deque接口植捎,Deque接口繼承了Queue接口衙解,使用LinkedList()創(chuàng)建隊(duì)列
        Queue queue=new LinkedList();
        queue.offer("hello");
        queue.offer("Queue");
        queue.offer("Deque");
        while (queue.size()>0){
            System.out.print(queue.remove()+" ");
        }
    }
}
  • 優(yōu)先隊(duì)列PriorityQueue



    優(yōu)先隊(duì)列默認(rèn)字符串以升序從隊(duì)列刪除


    圖片.png

7.示例:算數(shù)表達(dá)式求值

分析:
準(zhǔn)備兩個(gè)棧,一個(gè)用于準(zhǔn)備放符號(hào)operatorStack焰枢,一個(gè)用于準(zhǔn)備放數(shù)字operandStack蚓峦。
準(zhǔn)備:為得到的字符串表達(dá)式的()+-/左右兩邊添加空格舌剂,方便將多位數(shù)區(qū)分出來(lái)。以空格隔開暑椰。
1)如果遇到的是數(shù)字霍转,將其push到operandStack中
2)如果遇到的符號(hào)是+或-:
operatorStack不為空,并且棧頂元素是+-
/一汽,循環(huán)pop得到操作符避消,同時(shí)operandStack彈出兩個(gè)操作數(shù),將計(jì)算結(jié)果push進(jìn)operandStack角虫。直到 operatorStack為空
operatorStack為空沾谓,直接將操作符push進(jìn)operatorStack。
3)如果遇到的是或/戳鹅,棧頂元素是/,就彈出計(jì)算昏兆,循環(huán)直到operatorStack為空枫虏。
operatorStack為空,直接將操作符push進(jìn)operatorStack爬虱。
4)如果遇到的是(隶债,直接壓入符號(hào)棧;
如果遇到)跑筝,取出操作符計(jì)算死讹,直到棧頂元素是(,最后彈出(曲梗。
5)如果 operatorStack不為空赞警,就循環(huán),彈出 operatorStack操作符虏两,彈出operandStack中兩個(gè)數(shù)據(jù)愧旦,計(jì)算結(jié)果push進(jìn)operandStack。
6)返回operandStack的值就是結(jié)果

public class text3_算數(shù)表達(dá)式求值 {
    public static void main(String[] args){
        System.out.println("輸入算數(shù)表達(dá)式");
        Scanner input=new Scanner(System.in);
        String caculate=input.nextLine();
        try {
            System.out.println(evaluateExpression(caculate));
        }catch (Exception e){
            System.out.println("Wrong expression");
        }

    }

    private static Double evaluateExpression(String caculate) {
        //定義了操作符的棧
        Stack<Character> operatorStack=new Stack();
        //定義了操作數(shù)的棧
        Stack<Double> operandStack=new Stack();
        //需要在所有符號(hào)前后加上空格定罢,來(lái)分割數(shù)字笤虫,多位數(shù)才能正確讀取
        caculate=insertBlanks(caculate);
        String[] tokens=caculate.split(" ");
        for(String token:tokens){
            //分割后token,第一個(gè)是空格祖凫,可能分割后是第一個(gè)是空串
            if(token.length()==0)
                continue;
            //如果遇到的是+ -
            if(token.charAt(0)=='+'||token.charAt(0)=='-'){
                while(!operatorStack.isEmpty()&&(operatorStack.peek()=='+'||operatorStack.peek()=='-'||operatorStack.peek()=='*'||operatorStack.peek()=='/')){
                    processAnOperator(operandStack,operatorStack);
                }
                operatorStack.push(token.charAt(0));
            }
            //如果遇到的是* /
            else if(token.charAt(0)=='*'||token.charAt(0)=='/'){
                while (!operatorStack.isEmpty()&&(operatorStack.peek()=='*'||operatorStack.peek()=='/')){
                    processAnOperator(operandStack,operatorStack);
                }
                operatorStack.push(token.charAt(0));
            }
            //如果是(
            else if(token.charAt(0)=='('){
                operatorStack.push(token.charAt(0));
            }
            //如果是)
            else if(token.charAt(0)==')'){
                while (operatorStack.peek()!='('){
                    processAnOperator(operandStack,operatorStack);
                }
                operatorStack.pop();//把(彈出
            }
            //是數(shù)字
            else{

               operandStack.push(new Double(token));
            }
        }

        while (!operatorStack.isEmpty()){
            processAnOperator(operandStack,operatorStack);
        }

       //返回最后在數(shù)字棧內(nèi)的值就是結(jié)果
        return operandStack.pop();


    }

    private static String insertBlanks(String caculate) {
        String result="";
        for(int i=0;i<caculate.length();i++)
        {
            if(caculate.charAt(i)=='('||caculate.charAt(i)==')'||caculate.charAt(i)=='+'||caculate.charAt(i)=='-'
                    ||caculate.charAt(i)=='*'||caculate.charAt(i)=='/')
                result+=" "+caculate.charAt(i)+" ";
            else
                result+=caculate.charAt(i);
        }
        return result;
    }

    private static void processAnOperator(Stack<Double> operandStack, Stack<Character> operatorStack) {
        char op=operatorStack.pop();
        double num2=operandStack.pop();
        double num1=operandStack.pop();
        switch (op){
            case '+':operandStack.push(num1+num2);break;
            case '-':operandStack.push(num1-num2);break;
            case '*':operandStack.push(num1*num2);break;
            case '/':operandStack.push(num1/num2);break;
        }

    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琼蚯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惠况,更是在濱河造成了極大的恐慌遭庶,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件售滤,死亡現(xiàn)場(chǎng)離奇詭異罚拟,居然都是意外死亡台诗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門赐俗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拉队,“玉大人,你說(shuō)我怎么就攤上這事阻逮×豢欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵叔扼,是天一觀的道長(zhǎng)事哭。 經(jīng)常有香客問我,道長(zhǎng)瓜富,這世上最難降的妖魔是什么鳍咱? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮与柑,結(jié)果婚禮上谤辜,老公的妹妹穿的比我還像新娘。我一直安慰自己价捧,他們只是感情好丑念,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著结蟋,像睡著了一般脯倚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嵌屎,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天推正,我揣著相機(jī)與錄音,去河邊找鬼编整。 笑死舔稀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掌测。 我是一名探鬼主播内贮,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼汞斧!你這毒婦竟也來(lái)了夜郁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粘勒,失蹤者是張志新(化名)和其女友劉穎竞端,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庙睡,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡事富,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年技俐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片统台。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雕擂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贱勃,到底是詐尸還是另有隱情井赌,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布贵扰,位于F島的核電站仇穗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏戚绕。R本人自食惡果不足惜纹坐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舞丛。 院中可真熱鬧恰画,春花似錦、人聲如沸瓷马。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)欧聘。三九已至,卻和暖如春端盆,著一層夾襖步出監(jiān)牢的瞬間怀骤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工焕妙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒋伦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓焚鹊,卻偏偏與公主長(zhǎng)得像痕届,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子末患,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 棧 棧的英文單詞是Stack,它代表一種特殊的線性表研叫,這種線性表只能在固定一端(通常認(rèn)為是線性表的尾端)進(jìn)行插入,...
    Jack921閱讀 1,501評(píng)論 0 5
  • 數(shù)據(jù)結(jié)構(gòu)是編程的起點(diǎn),理解數(shù)據(jù)結(jié)構(gòu)可以從三方面入手: 邏輯結(jié)構(gòu)探橱。邏輯結(jié)構(gòu)是指數(shù)據(jù)元素之間的邏輯關(guān)系申屹,可分為線性結(jié)構(gòu)...
    yhthu閱讀 2,296評(píng)論 0 6
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法绘证,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法哗讥,繼承相關(guān)的語(yǔ)法嚷那,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,632評(píng)論 18 399
  • java筆記第一天 == 和 equals ==比較的比較的是兩個(gè)變量的值是否相等忌栅,對(duì)于引用型變量表示的是兩個(gè)變量...
    jmychou閱讀 1,500評(píng)論 0 3
  • 巨嬰索绪,求你快快長(zhǎng)大 2016年熱詞 ---巨嬰 于是我搜索了一下:心理滯留在...
    haihailo閱讀 269評(píng)論 0 2