數(shù)據(jù)結(jié)構(gòu):棧的介紹與實(shí)現(xiàn)(swift版)

什么是棧呢剩胁?

簡(jiǎn)單來說,棧是一種存儲(chǔ)數(shù)據(jù)的格式袱巨,分配內(nèi)存的一種方式阁谆。
類似于線性表(通過pNext指針的方式,指向下一個(gè)元素的地址)將數(shù)據(jù)串聯(lián)起來愉老。在這種內(nèi)存分配模式下场绿,只允許在一端(棧頂)進(jìn)行插入和刪除元素,因此嫉入,數(shù)據(jù)具備先進(jìn)后出的狀態(tài)焰盗。

如圖

tu.001.jpeg

我們可以把棧看做一個(gè)杯子咒林,在不斷向被子里放入比如橘子(??)吧熬拒,想象一下,當(dāng)我們把被子裝滿垫竞,我們想吃橘子的時(shí)候澎粟,是不是只能先拿最上面的,才能接著取下一個(gè)欢瞪,這就是棧的先進(jìn)后出活烙,也只能在杯子口放橘子和拿橘子。

簡(jiǎn)單的棧實(shí)現(xiàn)思路遣鼓。

我們可以把棧啸盏,看做一個(gè)簡(jiǎn)單的對(duì)象Stack(杯子),這個(gè)對(duì)象擁有2個(gè)指針骑祟,一個(gè)始終指向被子最上方的橘子(棧頂指針)回懦,一個(gè)永遠(yuǎn)指向杯底(棧底指針),并且有一些基本功能次企。比如:

  • 初始化一個(gè)空棧 init
  • 判斷棧是否為空 empty
  • 插入一份數(shù)據(jù) push
  • 刪除一份數(shù)據(jù) pop
  • 遍歷所有數(shù)據(jù) enumerateObjects

以下我們采用swift語言簡(jiǎn)單實(shí)現(xiàn)這些功能怯晕。首先我們打開Xcode新建命令行工程捅厂,語言選擇swift费坊,新建一個(gè)類,繼承自NSObject殖氏,命名為Stack,并且添加其棧頂和棧底指針蛉谜,和其基本的5個(gè)函數(shù)稚晚。

stack1.png

棧中的元素是以鏈表結(jié)構(gòu)相鏈接下一個(gè)數(shù)據(jù),為了便于操作型诚,我們會(huì)在棧初始化的時(shí)候客燕,創(chuàng)建一個(gè)空的節(jié)點(diǎn)(頭節(jié)點(diǎn)),然后讓棧頂和棧底指針指向該節(jié)點(diǎn)狰贯,實(shí)現(xiàn)一個(gè)空棧的創(chuàng)建也搓。

在實(shí)現(xiàn)空棧創(chuàng)建之前赏廓,我們還需要定義棧中的元素對(duì)象,由于采用鏈表結(jié)構(gòu)傍妒,如圖tu.001.jpeg幔摸,棧中元素存在一個(gè)數(shù)據(jù)域(存放數(shù)據(jù))和指針域(指向下一個(gè)對(duì)象的地址)相鏈接。

//棧元素對(duì)象
class Element: NSObject {
    //數(shù)據(jù)域 存放數(shù)據(jù)
    var data : NSObject?
    //節(jié)點(diǎn)域 指向下一個(gè)元素的指針
    var pNext : Element?
}

接下來實(shí)現(xiàn)空棧的創(chuàng)建颤练,重寫Stack類的init方法

override init() {
        //創(chuàng)建頭節(jié)點(diǎn)既忆。便于操作棧
        let elment = Element()
        //將棧低指針指向該節(jié)點(diǎn)
        bottom = elment
        //由于是空棧,所以此時(shí)嗦玖,棧頂和棧低指針同時(shí)指向該節(jié)點(diǎn)
        top = bottom
    }

緊接著我們依次實(shí)現(xiàn)上面我們提到的基本功能

Stack class code

class Stack: NSObject {

    var top : Element!     //棧頂指針
    var bottom : Element!  //棧底指針患雇,永遠(yuǎn)指向一個(gè)不用的元素
    
    override init() {
        //創(chuàng)建頭節(jié)點(diǎn)。便于操作棧
        let elment = Element()
        //將棧低指針指向該節(jié)點(diǎn)
        bottom = elment
        //由于是空棧宇挫,所以此時(shí)苛吱,棧頂和棧低指針同時(shí)指向該節(jié)點(diǎn)
        top = bottom
    }
    
    //棧是否是否為空
    func empty() -> Bool {
        //如果 棧頂指針和棧低指針同時(shí)指向同一個(gè)元素(即頭節(jié)點(diǎn)),那么這是一個(gè)空棧
        if top.isEqual(bottom) {
            return true
        }
        return false
    }
    
    //插入數(shù)據(jù)
    func push(value:NSObject){
        //首先創(chuàng)建要插入的節(jié)點(diǎn)元素
        let element = Element()
        element.data = value
        //緊接著將元素加到棧頂器瘪,首先使得該元素的下一個(gè)pNext指向棧頂對(duì)象
        element.pNext = top
        //接著將最新的元素 設(shè)為棧頂元素
        top = element
    }
    
    //刪除數(shù)據(jù),即只刪除棧的最上方的元素
    //swift自動(dòng)釋放機(jī)制翠储,只需要將棧頂指針下移即可
    func pop() -> NSObject? {
        if !empty() {
            let elemet = top
            top = top.pNext
            //返回刪除的元素
            return elemet
        }
        return nil
    }
    
    //遍歷數(shù)據(jù),這里只作簡(jiǎn)單的輸出
    func enumerateObjects() {
        //這里只做簡(jiǎn)單的遍歷輸出
        //取一個(gè)臨時(shí)的指針娱局,找到棧頂指針彰亥,不斷下移實(shí)現(xiàn)輸出
        var element = top
        while !(element?.isEqual(bottom))! {
            print("元素的值為\(element?.data!)")
            element = element?.pNext
        }
    }
}

至此,我們簡(jiǎn)單的棧的功能就實(shí)現(xiàn)啦衰齐,你可以嘗試創(chuàng)建一個(gè)棧,插入和刪除元素試試哦继阻。

test.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耻涛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瘟檩,更是在濱河造成了極大的恐慌抹缕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墨辛,死亡現(xiàn)場(chǎng)離奇詭異卓研,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睹簇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門奏赘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人太惠,你說我怎么就攤上這事磨淌。” “怎么了凿渊?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵梁只,是天一觀的道長(zhǎng)缚柳。 經(jīng)常有香客問我,道長(zhǎng)搪锣,這世上最難降的妖魔是什么秋忙? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮构舟,結(jié)果婚禮上灰追,老公的妹妹穿的比我還像新娘。我一直安慰自己旁壮,他們只是感情好监嗜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抡谐,像睡著了一般裁奇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上麦撵,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天刽肠,我揣著相機(jī)與錄音,去河邊找鬼免胃。 笑死音五,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的羔沙。 我是一名探鬼主播躺涝,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼扼雏!你這毒婦竟也來了坚嗜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤诗充,失蹤者是張志新(化名)和其女友劉穎苍蔬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝴蜓,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碟绑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茎匠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片格仲。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖汽抚,靈堂內(nèi)的尸體忽然破棺而出抓狭,到底是詐尸還是另有隱情,我是刑警寧澤造烁,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布否过,位于F島的核電站午笛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏苗桂。R本人自食惡果不足惜药磺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煤伟。 院中可真熱鬧癌佩,春花似錦、人聲如沸便锨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽放案。三九已至姚建,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吱殉,已是汗流浹背掸冤。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留友雳,地道東北人稿湿。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像押赊,于是被迫代替她去往敵國和親饺藤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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