數(shù)據(jù)結(jié)構(gòu)——棧

目錄

1、定義

2愧哟、實(shí)現(xiàn)

2.1 簡(jiǎn)單數(shù)組實(shí)現(xiàn)

2.1.1 代碼實(shí)現(xiàn)
2.1.2 性能和局限性

2.2 動(dòng)態(tài)數(shù)組實(shí)現(xiàn)

2.2.1 代碼實(shí)現(xiàn)
2.2.2 性能

2.3 鏈表實(shí)現(xiàn)

2.3.1 代碼實(shí)現(xiàn)
2.3.2 性能

2.4 基于數(shù)組實(shí)現(xiàn)和基于鏈表實(shí)現(xiàn)的比較

2.4.1 基于數(shù)組實(shí)現(xiàn)的棧
2.4.2 基于鏈表實(shí)現(xiàn)的棧

正文

1、定義

棧是一個(gè)有序線性鏈表鸵闪,只能在表的一端(稱(chēng)為棧頂梯皿,top)執(zhí)行插入和刪除主儡。

  • 入棧(push),表示在棧中插入一個(gè)元素。
  • 出棧(pop),表示從棧中刪除一個(gè)元素。
  • 下溢(underflow),試圖對(duì)一個(gè)空棧執(zhí)行出棧操作。
  • 溢出(overflow)吝羞,試圖對(duì)一個(gè)滿(mǎn)棧執(zhí)行入棧操作。


    圖1-1 例子

2负懦、實(shí)現(xiàn)

有以下三種常見(jiàn)的實(shí)現(xiàn)方法:

  • 基于簡(jiǎn)單數(shù)組的實(shí)現(xiàn)方法
  • 基于動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)方法
  • 基于鏈表的實(shí)現(xiàn)方法

2.1 簡(jiǎn)單數(shù)組實(shí)現(xiàn)

如下圖所示颗品,從左至右向數(shù)組添加所有元素槐臀,并定義一個(gè)變量來(lái)記錄數(shù)組當(dāng)前棧頂(top)元素的下標(biāo)。


圖2-1 簡(jiǎn)單數(shù)組實(shí)現(xiàn)
2.1.1 代碼實(shí)現(xiàn)
public class ArrayStack {
    private int top;
    private int capacity;
    private int[] array;

    //初始化
    public ArrayStack(){
        capacity=5;
        array=new int[capacity];
        top=-1;
    }

    //是否下溢
    public boolean isEmpty(){
        return (top==-1);
    }

    //是否溢出
    public boolean isStackFull(){
        return (top==capacity-1);
    }

    //入棧
    public void push(int data){
        if(isStackFull()){
            System.out.print("溢出");
        }else {
            array[++top]=data;
        }
    }

    //出棧
    public int pop(){
        if(isEmpty()){
            System.out.print("下溢");
            return 0;
        }else {
            return(array[top--]);
        }
    }

    //大小
    public int size(){
        return capacity;
    }

    //銷(xiāo)毀
    public void deleteStack(){
        top=-1;
    }
}
2.1.2 性能和局限性
  • 性能:假設(shè)n為棧中元素的個(gè)數(shù)侮邀,下圖為各算法的時(shí)間復(fù)雜度。


    圖2-2 性能
  • 局限性:棧的最大空間必須預(yù)先聲明且不能改變题暖,試圖對(duì)一個(gè)滿(mǎn)棧執(zhí)行入棧操作將報(bào)溢出異常按傅。

2.2 動(dòng)態(tài)數(shù)組實(shí)現(xiàn)

上述存在的問(wèn)題是在固定大小的數(shù)組中捉超,如何處理所有空間都已經(jīng)保存了棧元素這種情況呢?可以使用重復(fù)倍增技術(shù)來(lái)提高性能唯绍,如果數(shù)組空間已滿(mǎn)拼岳,新建一個(gè)比原來(lái)數(shù)組空間大一倍的新數(shù)組,然后復(fù)制元素况芒。

2.2.1 代碼實(shí)現(xiàn)
public class DynArrayStack {
    private int top;
    private int capacity;
    private int[] array;

    //初始化
    public DynArrayStack(){
        capacity=5;
        array=new int[capacity];
        top=-1;
    }

    //是否下溢
    public boolean isEmpty(){
        return (top==-1);
    }

    //是否溢出
    public boolean isStackFull(){
        return (top==capacity-1);
    }

    //入棧
    public void push(int data){
        if(isStackFull()){
            doubleStack();
        }
        array[++top]=data;
    }

    //出棧
    public int pop(){
        if(isEmpty()){
            System.out.print("下溢");
            return 0;
        }else {
            return(array[top--]);
        }
    }

    //倍增
    private void doubleStack(){
        int newArray[]=new int[capacity*2];
        System.arraycopy(array,0,newArray,0,capacity);
        capacity=capacity*2;
        array=newArray;
    }

    //銷(xiāo)毀
    public void deleteStack(){
        top=-1;
    }
}
2.2.2 性能

假設(shè)n為棧中元素的個(gè)數(shù)惜纸,下圖為各算法的時(shí)間復(fù)雜度。


圖2-3 性能

2.3 鏈表實(shí)現(xiàn)

通過(guò)在鏈表的表頭插入元素的方式實(shí)現(xiàn)push操作绝骚,刪除鏈表的表頭結(jié)點(diǎn)(棧頂結(jié)點(diǎn))實(shí)現(xiàn)pop操作耐版。


圖2-4 鏈表實(shí)現(xiàn)
2.3.1 代碼實(shí)現(xiàn)
public class LLStack {
    private ListNode headNode;

    //初始化
    public LLStack(){
        this.headNode=null;
    }

    //入棧
    public void push(int data){
        if(headNode==null){
            headNode=new ListNode(data);
        }else{
            ListNode llNode=new ListNode(data);
            llNode.setNext(headNode);
            headNode=llNode;
        }
    }

    //棧頂元素
    public int top(){
        if(headNode==null){
            return -1;
        }else {
            return (headNode.getData());
        }
    }

    //出棧
    public int pop(){
        if(headNode==null){
            return -1;
        }else {
            int data=headNode.getData();
            headNode=headNode.getNext();
            return data;
        }
    }

    //是否下溢
    public boolean isEmpty(){
        if(headNode==null){
            return true;
        }else {
            return false;
        }
    }

    //銷(xiāo)毀
    public void deleteStack(){
        headNode=null;
    }
}
2.3.2 性能

假設(shè)n為棧中元素的個(gè)數(shù),下圖為各算法的時(shí)間復(fù)雜度压汪。


圖2-5 性能

2.4 基于數(shù)組實(shí)現(xiàn)和基于鏈表實(shí)現(xiàn)的比較

2.4.1 基于數(shù)組實(shí)現(xiàn)的棧
  • 各個(gè)操作都是常數(shù)時(shí)間的開(kāi)銷(xiāo)粪牲。
  • 每隔一段時(shí)間倍增操作的開(kāi)銷(xiāo)較大。
  • n個(gè)操作的任意序列的平攤時(shí)間開(kāi)銷(xiāo)為O(n)止剖。
2.4.2 基于鏈表實(shí)現(xiàn)的棧
  • 棧規(guī)模的增加和減少都很簡(jiǎn)潔腺阳。
  • 各個(gè)操作都是常數(shù)時(shí)間開(kāi)銷(xiāo)。
  • 每個(gè)操作都需要使用額外的空間和時(shí)間開(kāi)銷(xiāo)來(lái)處理指針穿香。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亭引,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子皮获,更是在濱河造成了極大的恐慌焙蚓,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魔市,死亡現(xiàn)場(chǎng)離奇詭異主届,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)待德,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)君丁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人将宪,你說(shuō)我怎么就攤上這事绘闷。” “怎么了较坛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵印蔗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我丑勤,道長(zhǎng)华嘹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任法竞,我火速辦了婚禮耙厚,結(jié)果婚禮上强挫,老公的妹妹穿的比我還像新娘。我一直安慰自己薛躬,他們只是感情好俯渤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著型宝,像睡著了一般八匠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趴酣,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天梨树,我揣著相機(jī)與錄音,去河邊找鬼价卤。 笑死劝萤,一個(gè)胖子當(dāng)著我的面吹牛渊涝,可吹牛的內(nèi)容都是我干的慎璧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼跨释,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胸私!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鳖谈,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤岁疼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后缆娃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體捷绒,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晨雳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年秧廉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枫弟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜈彼。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筑舅,死狀恐怖巡通,靈堂內(nèi)的尸體忽然破棺而出鸠按,到底是詐尸還是另有隱情醒陆,我是刑警寧澤宅广,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布葫掉,位于F島的核電站,受9級(jí)特大地震影響跟狱,放射性物質(zhì)發(fā)生泄漏俭厚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一驶臊、第九天 我趴在偏房一處隱蔽的房頂上張望挪挤。 院中可真熱鬧绪抛,春花似錦、人聲如沸电禀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尖飞。三九已至症副,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間政基,已是汗流浹背贞铣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沮明,地道東北人辕坝。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像荐健,于是被迫代替她去往敵國(guó)和親酱畅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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