兩種基本的資料結構,兩種資料結構

來源:互聯網
上載者:User

兩種基本的資料結構,兩種資料結構
棧的基本操作包括入棧push和出棧pop,棧有一個棧頂指標top,指向最新如棧的元素,入棧和出棧操作操作都是從棧頂端進行的。

  隊列的基本操作包括入隊enqueue和出隊dequeue,隊列有隊頭head和隊尾tail指標。元素總是從隊頭出,從隊尾入。採用數組實現隊列時候,為了合理利用空間,可以採用迴圈實現隊列空間的有效利用。

  關於棧和隊列的基本操作如所示:

採用數組簡單實現一下棧和隊列,實現隊列時候,長度為n的數組最多可以含有n-1個元素,迴圈利用,這樣方便判斷隊列是空還是滿。程式如下所示:

View CodeView Code

測試結果如下所示:

問題:

(1)說明如何用兩個棧實現一個隊列,並分析有關隊列操作的已耗用時間。

解答:棧中的元素是先進後出,而隊列中的元素是先進先出。現有棧s1和s2,s1中存放隊列中的結果,s2輔助轉換s1為隊列。入隊列操操作:當一個元素入隊列時,先判斷s1是否為空白,如果為空白則新元素直接入s1,如果非空則將s1中所有元素出棧並存放到s2中,然後在將元素入s1中,最後將s2中所有元素出棧併入s1中。此時s1中存放的即是隊列入隊的順序。出隊操作:如果s1為空白,則說明隊列為空白,非空則s1出棧即可。入隊過程需要在s1和s2來回交換,已耗用時間為O(n),出隊操作直接是s1出棧已耗用時間為O(1)。舉例說明轉換過程,如示:

我採用C++語言實現整程式如下:

View Code

(2)說明如何用兩個隊列實現一個棧,並分析有關棧操作的已耗用時間。

解答:類似上面的題目,隊列是先進先出,而棧是先進後出。現有隊列q1和q2,q1中存放的是棧的結果,q2輔助q1轉換為棧。入棧操作:當一個元素如棧時,先判斷q1是否為空白,如果為空白則該元素之間入隊列q1,如果非空則將q1中的所有元素出隊併入到q2中,然後將該元素入q1中,最後將q2中所有元素出隊併入q1中。此時q1中存放的就是棧的如棧順序。出棧操作:如果q1為空白,則棧為空白,否則直接q1出隊操作。入棧操作需要在隊列q1和q2直接來來回交換,已耗用時間為O(n),出棧操作是隊列q1出隊操作,已耗用時間為O(1)。我用C++語言實現完整程式如下:

View Code

 2、鏈表

  鏈表與數組的區別是鏈表中的元素順序是有各對象中的指標決定的,相鄰元素之間在實體記憶體上不一定相鄰。採用鏈表可以靈活地表示動態集合。鏈表有單鏈表和雙鏈表及迴圈鏈表。書中著重介紹了雙鏈表的概念及操作,雙鏈表L的每一個元素是一個對象,每個對象包含一個關鍵字和兩個指標:next和prev。鏈表的操作包括插入一個節點、刪除一個節點和尋找一個節點,重點來說一下雙向鏈表的插入和刪除節點操作,圖例如下:

鏈表是最基本的資料結構,凡是學電腦的必須的掌握的,在面試的時候經常被問到,關於鏈表的實現,百度一下就知道了。在此可以討論一下與鏈表相關的練習題。

(1)在單鏈表上插入一個元素,要求時間複雜度為O(1)。

解答:一般情況在鏈表中插入一元素是在末尾插入的,這樣需要從頭遍曆一次鏈表,找到末尾,時間為O(n)。要在O(1)時間插入一個新節點,可以考慮每次在前端節點後面插入,即每次插入的節點成為鏈表的第一個節點。

(2)在單鏈表上刪除一個給定的節點p,要求時間複雜度為O(1)。

解答:一般情況刪除一個節點時候,我們需要找到該節點p的前驅節點q,需要對鏈表進行遍曆,已耗用時間為O(n-1)。我們可以考慮先將q的後繼節點s的值替換q節點值,然後刪除s即可。如刪除節點q的操作過程:

(3)單鏈表逆置,不允許額外分配儲存空間,不允許遞迴,可以使用臨時變數,執行時間為O(n)。

解答:這個題目在面試筆試中經常碰到,基本思想上將指標逆置。如所示:

(4)遍曆單鏈表一次,找出鏈表中間節點。

解答:定義兩個指標p和q,初始都指向鏈表前端節點。然後開始向後遍曆,p每次移動2步,q移動一步,當p到達末尾的時候,p正好到達了中間位置。

(5)用一個單鏈表L實現一個棧,要求push和pop的操作時間為O(1)。

解答:根據棧中元素先進後出的特點,可以在鏈表的頭部進行插入和刪除操作。

(6)用一個單鏈表L實現一個隊列,要求enqueue和dequeue的操作時間為O(1)。

解答:隊列中的元素是先進先出,在單鏈表結構中增加一個尾指標,資料從尾部插入,從頭部刪除。

3、有根樹的表示

  採用鏈表資料結構來表示樹,書中先降二叉樹的鏈表標記法,然後拓展到分支數無限制的有根數。先來看看二叉樹的鏈表表示方法,用域p、left和right來儲存指向二叉樹T中的父親、左孩子和右孩子的指標。如所示:

  對於分支數目無限制的有根樹,採用左孩子、右兄弟的表示方法。這樣表示的樹的每個節點都包含有一個父親指標p,另外兩個指標:

(1)left_child指向節點的最左孩子。

(2)right_sibling指向節點緊右邊的兄弟。


資料結構中,最基本、最常用的兩種儲存結構是:()與()

鏈表,棧
 
資料結構有什基本演算法

所謂的基本演算法應該是指:
一、排序演算法
1、有簡單排序(包括冒泡排序、插入排序、選擇排序)
2、快速排序,很常見的
3、堆排序,
4、歸併排序,最穩定的,即沒有太差的情況
二、搜尋演算法
最基礎的有二分搜尋演算法,最常見的搜尋演算法,前提是序列已經有序
還有深度優先和廣度有限搜尋;及使用剪枝,A*,hash表等方法對其進行最佳化。
三、當然,對於基本資料結構,棧,隊列,樹。都有一些基本的操作
例如,棧的pop,push,隊列的取隊頭,如隊;以及這些資料結構的具體實現,使用連續的儲存空間(數組),還是使用鏈表,兩種具體儲存方法下操作方式的具體實現也不一樣。
還有樹的操作,如先序遍曆,中序遍曆,後續遍曆。
當然,這些只是一些基本的針對資料結構的演算法。
而基本演算法的思想應該有:
1、回溯
2、遞迴
3、貪心
4、動態規劃
5、分治
有些資料結構教材沒有涉及基礎演算法,lz可以另外找一些基礎演算法書看一下。有興趣的可以上oj做題,呵呵。演算法真的要學起來那是挺費勁。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.