初始化栈的代码_数据结构中的栈,你知道多少?
由于棧比較簡單,也很容易理解,學過的人都知道一句話就可以描述棧的特性:后進先出。所以這篇文章主要是寫如何使用代碼來描述棧,當然也是讓大家很容易理解的語言。還是先給出這篇文章的大致脈絡。
首先,對棧有一個基本認識接下來,用代碼實現棧,以及棧的常用操作然后,介紹棧的幾種應用場景最后,小結一下。
OK,開始。
一、初識棧
棧其實就是一個后進先出的線性表。就好比有很多輛車進了一個死胡同,第一進去的,總是最后一個出來。下面圖來演示一下:
這個圖我是用畫圖工具畫的,所以畫的不好看,還請見諒,但是基本上都能看懂,第一輛進去的車,總是最后一個出去。
有了這個概念,我們再來看一下棧的分類。棧的分類是根據其存儲結構來劃分的。有順序存儲結構和鏈式存儲結構。這個兩種結構也會有相應的代碼實現。
然后就是棧的常用操作:
(1)判斷棧是否為空、是否已滿
(2)入棧、出棧操作
(3)獲取棧頂元素
(4)獲取棧的大小
這里面比較重要的就是入棧和出棧操作了。因此下面先用兩張圖來表示一下,入棧和出棧的操作。首先是入棧
然后就是出棧操作
OK,到這首先總結一下,在第一部分,提到棧的特點:后進先出。然后講有兩個分類,最后給出了常用方法。下面這一部分就開始使用代碼去實現一個棧了。
二、棧的實現
1、順序棧
順序棧是根據順序存儲結構來寫的,底層是由數組來實現的。因此在這里我們不需要定義節點,在這里用java代碼實現順序棧有兩個步驟,
第一:定義棧的接口,接口內部定義了棧的常用操作方法
第二:然后就是接口的實現了。
下面按照這個步驟一步一步來看。
第一步:定義接口
第二步:接口的實現
從上面的操作可以看到,一共實現了4個方法,其中有兩個構造方法和初始化 方法。有一個知識點需要掌握,就是push的時候,先插入再移動。pop的時候,先移動再插入。代碼很簡單。注釋的很清晰。畢竟只有當你有需要的時候,才會去認真看代碼。下面看看鏈式棧
2、鏈式棧
這個鏈式棧就需要你定義節點了,因為鏈式棧的每一個節點要存的信息比較多,比如當前節點的數據值,還有下一個節點的地址,因此實現一個鏈式棧,也需要兩個步驟:
第一:定義節點
第二:根據節點定義棧的接口
第三:實現接口
下面就根據上面的步驟來一步一步實現:
第一步:定義節點
第二步:根據節點定義接口:
第三步:實現棧接口
OK,這個鏈式棧其實和順序棧差不多,稍微麻煩一點,不過這些代碼看起來也比較簡單,比如說我出棧的時候要先判斷當前棧是否為空。入棧 的時候要判斷棧是否已滿。有了對棧的基本操作,我們就可以進入下一階段的學習,也就是棧的使用場景
三、棧的使用場景
1、表達式計算
比如現在有一個表達式1+(4-6*3)/2=2。然后我們使用棧,看看如何去計算他。
第一步:我們需要將這個表達式表示為后綴表達式1463*-2/+。
第二步:使用棧來計算(圖解):碰見數字就入棧,碰見符號先運算。
從上面的例子應該能看懂,只需要掌握一句話:遇見數字就入棧,遇見符號就出棧,然后把結果再入棧。
2、遞歸
我們都知道有一個著名的函數叫斐波那契數列,它是由另外一個著名的例子引出來的
假如說兔子在出生兩個月就有繁殖能力,以后一對兔子每個月能生一對小兔子,假設所有兔子不死,也不考慮近親結婚這些情況,一年后一共有多少只兔子。
我們可以看出,幾個月之后,老兔子可以生小兔子,一開始生的小兔子也可以生小小兔子了,無窮無盡。這個就是一個斐波那契數列。1:1:2:3:5:8:13.。。。。。
當我們使用棧就可以很容易解決這個問題,
代碼就是一個遞歸函數。我可以給出
3、括號匹配
這個問題,說實話自己是最熟悉的,因為我考研究生的時候,機試就有這道題,還在考前狠狠的復習了好幾遍。括號匹配跟表達式求解的形式差不多,但是稍微有一點出入。舉個例子吧
輸入一個字符串 里面只含有 [ , ] , ( , ) 四種括號 ; 現要求判斷這個字符串 是否滿足括號匹配 。如 ([])() 是匹配的 ([)]是不匹配的
給出代碼
四、總結
由于這里主要講解數據結構中的棧,所以就不給出java中的棧了,java中的stack我會在集合專題講解,還請大家支持關注。說到底棧還是比較簡單的,包括隊列,其特點很容易理解,關鍵在于應用和平時的面試題。謝謝。
喜歡的給個關注唄,謝謝
總結
以上是生活随笔為你收集整理的初始化栈的代码_数据结构中的栈,你知道多少?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab z变换离散化_MATLAB
- 下一篇: 手机安装pem_抓包神器Charles的