1. 程式人生 > >棧和佇列基礎知識

棧和佇列基礎知識

      棧和佇列也是線性表,其特殊性在於棧和佇列的基本操作是線性表操作的子集,它們是操作受限的線性表,因此,可稱為限定性的資料結構。但從資料型別角度看,它們是和線性表大不相同的兩類重要的抽象資料型別。

        棧是限定僅在表尾進行插入或刪除操作的線性表。因此,對棧來說,表尾端有其特殊含義,稱為棧頂,相應地,表頭端稱為棧底。不含元素的空表稱為空棧。         棧又稱為後進先出的線性表(簡稱LIFO結構)。

棧的抽象資料型別定義  ADT Stack { 資料物件: D={ ai | ai ∈ElemSet, i=1,2,...,n,  n≥0 } 資料關係: R1={ <ai-1 ,ai >|ai-1 ,ai∈D,  i=2,...,n }         約定an端為棧頂,a1端為棧底
基本操作: }ADT Stack InitStack (&S)  (構造空棧 ) 操作結果:構造一個空棧S。 DestroyStack(&S)   (銷燬棧結構) 初始條件:棧S已存在。 操作結果:棧S被銷燬。 ClearStack (&S)  (棧清空) 初始條件:棧S已存在。 操作結果:棧S清為空棧。 StackEmpty (S)   (判空) 初始條件:棧S已存在。 操作結果:若棧S為空棧,則返回TRUE, 否則FALSE。 StackLength (S) (求棧長) 初始條件:棧S已存在。 操作結果:返回S的元素個數,即棧的長度。 StackTraverse (S, visit( )) (遍歷棧) 初始條件:棧S已存在且非空。 操作結果:從棧底到棧頂依次對S的每個資料元素調               用函式visit()。一旦visit()失敗,則操作失效。
GetTop (S, &e)   (求棧頂元素) 初始條件:棧S已存在且非空。 操作結果:用e返回S的棧頂元素。 Push (&S, e) (入棧) 初始條件:棧S已存在。 操作結果:插入元素e為新的棧頂元素。 Pop (&S, &e)  (出棧) 初始條件:棧S已存在且非空。 操作結果:刪除S的棧頂元素,並用e返回其值。


棧的表示和實現         和線性表類似,棧也有兩種儲存表示方法。         順序棧,即棧的順序儲存結構是利用一組地址連續的儲存單元依次存放自棧底到棧頂的資料元素,同時附設指標top指示棧頂元素在順序棧中的位置。base可稱為棧底指標,在順序棧中,它始終指向棧底的位置,若base的值為NULL,則表明棧結構不存在。稱top為棧頂指標,其初始值指向棧底,即top=base可以作為棧空的標記。每當插入新的棧頂元素時,指標top增1,刪除棧頂元素時,指標top減1,因此,非空棧中的棧頂指標始終在棧頂元素的下一個位置上。


鏈棧:由於棧的操作是線性表操作的特例,則鏈棧易於實現,在此不做詳細討論。 說明:         ①  鏈棧不必設頭結點,因為棧頂(表頭)操作頻繁; ②採用鏈棧儲存方式,可使多個棧共享空間;當棧中元素個數變化較大,且存在多個棧的情況下,鏈棧是棧的首選儲存方式。 順序棧和鏈棧的比較  時間效能:相同,都是常數時間O(1)。 空間效能:          順序棧:有元素個數的限制和空間浪費的問題。          鏈棧:沒有棧滿的問題,只有當記憶體沒有可用空間時才會出現棧滿,但是每個元素都需要一個指標域,從而產生了結構性開銷。  總之,當棧的使用過程中元素個數變化較大時,用鏈棧是適宜的,反之,應該採用順序棧。  棧應用舉例:數制轉換,括號匹配,行編輯程式,迷宮求解,表示式求值,遞迴的實現等

佇列         和棧相反,佇列是一種先進先出(FIFO)的線性表。它只允許在表的一端進行插入,而在另一端刪除元素。在佇列中允許插入的一端叫隊尾,允許刪除的一端則稱為隊頭。

佇列的抽象資料型別定義 : ADT Queue {         資料物件: D={ ai | ai ∈ElemSet, i=1,2,...,n,  n≥0 } 資料關係: R1={ <ai-1 ,ai >|ai-1 ,ai∈D,  i=2,...,n }         約定an端為隊尾,a1端為隊頭 基本操作: }ADT Queue InitQueue (&Q)  (構造空佇列 ) 操作結果:構造一個空佇列Q。 DestroyQueue (&Q)   (銷燬佇列結構) 初始條件:佇列Q已存在。 操作結果:佇列Q被銷燬。 ClearQueue  (&Q)  (佇列清空) 初始條件:佇列Q已存在。 操作結果:佇列Q清為空佇列。 QueueEmpty (Q)   (判空) 初始條件:佇列Q已存在。 操作結果:若佇列Q為空,則返回TRUE, 否則FALSE。 QueueLength (Q) (求佇列長) 初始條件:佇列Q已存在。 操作結果:返回Q的元素個數,即佇列的長度。 QueueTraverse (Q, visit( )) (遍歷佇列) 初始條件:佇列Q已存在且非空。 操作結果:從隊頭到隊尾,依次對Q的每個資料元素            呼叫函式visit()。一旦visit()失敗,則操作失效。 GetHead (Q, &e)   (求隊頭元素) 初始條件:佇列Q已存在且非空。 操作結果:用e返回Q的隊頭元素。 EnQueue (&Q, e) (入隊) 初始條件:佇列Q已存在。 操作結果:插入元素e為新的隊頭元素。 DeQueue (&Q, &e)  (出隊) 初始條件:佇列Q已存在且非空。 操作結果:刪除Q的隊頭元素,並用e返回其值。         除了棧和佇列之外,還有一種限定性資料結構是雙端佇列。
        雙端佇列是限定插入和刪除操作在表的兩端進行的線性表。這兩端分別稱作端點1和端點2,也可以像棧一樣,可以用一個鐵道轉軌網路來比喻雙端佇列。在實際使用中,還可以有輸出受限的雙端佇列(即:一個端點允許插入和刪除,另一個端點只允許插入的雙端佇列)和輸入受限的雙端佇列(即一個端點允許插入和刪除,另一個端點只允許刪除的雙端佇列)。而如果限定雙端佇列從某個點插入的元素只能從該端點刪除,則該雙端佇列就蛻變為兩個棧底相鄰接的棧了。儘管雙端佇列看起來似乎比棧和佇列更靈活,但實際上在應用程式中遠不及棧和佇列有用。

佇列的鏈式儲存結構及實現

如何改進出隊的時間效能?         放寬佇列的所有元素必須儲存在陣列的前n個單元這一條件 ,只要求佇列的元素儲存在陣列中連續的位置。         設定隊頭、隊尾兩個指標  如何確定不同的隊空、隊滿的判定條件? 為什麼要將隊空和隊滿的判定條件分開?         方法一:附設一個儲存佇列中元素個數的變數num,  當num=0時隊空,當num=QueueSize時為隊滿;          方法二:修改隊滿條件,浪費一個元素空間,隊滿時陣列中只有一個空閒單元;          方法三:設定標誌flag,當front=rear且flag=0時為隊空,當front=rear且flag=1時為隊滿。



迴圈佇列和鏈佇列的比較:         時間效能: 迴圈佇列和鏈佇列的基本操作都需要常數時間O (1)。          空間效能: 迴圈佇列:必須預先確定一個固定的長度,所以有儲存元素個數的限制和空間浪費的問題。 鏈佇列:沒有佇列滿的問題,只有當記憶體沒有可用空間時才會出現佇列滿,但是每個元素都需要一個指標域,從而產生了結構性開銷。  隊空條件 :  front = rear       (初始化時:front = rear ) 隊滿條件: front = (rear+1) % N         (N=maxsize) 佇列長度:L=(N+rear-front)% N  線性表、棧與隊的異同點          相同點:邏輯結構相同,都是線性的;都可以用順序儲存或連結串列儲存;棧和佇列是兩種特殊的線性表,即受限的線性表(只是對插入、刪除運算加以限制)。          不同點: ① 運算規則不同,線性表為隨機存取,插入刪除位置隨意。而棧是隻允許在一端進行插入和刪除運算,因而是後進先出表LIFO;佇列是隻允許在一端進行插入、另一端進行刪除運算,因而是先進先出表FIFO。 ② 用途不同,線性表比較通用;堆疊用於函式呼叫、遞迴和簡化設計等;佇列用於離散事件模擬、多道作業處理和簡化設計等。 





相關推薦

佇列基礎知識

1、對於鏈棧來說,基本不存在棧滿的情況,除非記憶體已經沒有可以使用的空間了,如果真的發生,那此時計算機作業系統已經面臨斯基崩潰,而不是這個鏈棧是否溢位的問題。 2、如果棧的使用過程中元素變化不可預料,有時很小,有時很大,則最好採用鏈棧,反之,如果變化在可控範圍內,建議使用順

佇列基礎知識

      棧和佇列也是線性表,其特殊性在於棧和佇列的基本操作是線性表操作的子集,它們是操作受限的線性表,因此,可稱為限定性的資料結構。但從資料型別角度看,它們是和線性表大不相同的兩類重要的抽象資料型

資料結構:使用佇列相關知識列印楊輝三角

本文利用資料結構佇列知識程式設計實現列印楊輝三角,原始碼如下: #include <stdio.h> #define MAXSIZE 50 #define N 10 typedef int QueueElementType; typedef

【內功】基礎演算法——佇列

導語: 下面兩個連結是我的leetcode棧和佇列的分類。 棧:https://www.cnblogs.com/zhangwanying/p/9886577.html (共40題) 佇列:https://www.cnblogs.com/zhangwanying/p/9886581.html(共

資料結構基礎02-佇列

本文系列 資料結構基礎01-基本概念和術語/線性表 資料結構基礎02-棧和佇列 棧 棧(Stack):所有的插入和刪除只在表的一端進行的線性表,即是一種操作受限的線性表。在表中,允許插入和刪除的一端叫棧頂(top),不允許插 入和刪除的另一端叫棧底(bottom)。 特點

Java之美[從菜鳥到高手演變]之資料結構基礎、線性表、佇列、陣列字串

Java面試寶典之資料結構基礎 —— 線性表篇作者:egg郵箱:[email protected]這部分內容作為計算機專業最基礎的知識,幾乎被所有企業選中用來作考題,因此,本章我們從本章開始,我們將從基礎方面對資料結構進行講解,內容主要是線性表,包括棧、佇列、陣列、

OLAPOLTP基礎知識

library 批量更新 info image 其它 效果 直觀 關鍵字 使用位圖 數據處理大致可以分成兩大類:聯機事務處理OLTP(on-line transaction processing)、聯機分析處理OLAP(On-Line Analytical Processi

資料結構JAVA版之佇列

一、涉及的內容大綱 二、簡單介紹棧、佇列和其他資料結構的不同 1 對於其他的資料結構而言,都適用與資料庫應用中作資料記錄。但是因為棧和佇列的生命週期比那些資料庫型別的資料結構要短,所以他們只是在程式的操作期間才會建立和執行,在完成任務之後就會被銷燬。所以棧和佇列更多的是用於構思演算法的

陣列連結串列與佇列之間的關係及堆之間的關係

本屌最近在學習資料結構過程中,由於連續看了陣列,棧,佇列,連結串列等,一時混雜,下面摘取參考資料,供自己學習使用。 第一部分:介紹了資料儲存結構和資料結構的區別,以及連結串列和陣列的差異。 第二部分:介紹了堆和棧的區別。 (1)資料儲存結構:計算機的一個概念,描述資料在計算機中儲存方式;常用

玩轉資料結構——第二章:佇列

內容概覽: 棧和棧的應用:撤銷操作和系統棧 棧的基本實現 棧的另外一個應用:括號匹配 關於Leetcode的更多說明 陣列佇列 迴圈佇列 迴圈佇列的實現 陣列佇列和迴圈佇列的比較 2-1.棧(Stack) 棧也是一種線性結構

js 實現佇列

js實現棧或者佇列有兩種方式: 1.陣列:陣列本身提供棧方法(push,pop),佇列方法(push,shift)。 程式碼實現(棧): /*=======棧結構=======*/ var stack=function(){ this.data=[] this.push=push

C - Crusaders Quest (佇列的運用)

滴答滴答---題目連結  Crusaders Quest is an interesting mobile game. A mysterious witch has brought great darkness to the game world, and the only hope

資料結構實踐 停車場模擬 佇列綜合

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

線性結構 -- 佇列

線性結構 – 棧和佇列 線性結構是一個有序資料元素的集合。 常用的線性結構有:線性表,棧,佇列,雙佇列,陣列,串。 常見的非線性結構有:二維陣列,多維陣列,廣義表,樹(二叉樹等),圖。 特徵: 1.集合中必存在唯一的一個"第一個元素"; 2.集合中必存在唯一的一個"最後的元素

解析佇列面試題

一、實現一個棧,要求實現Push(入棧)、Pop(出棧)、Min(返回最小值)的時間複雜度為O(1) 思路: 1、首先定義兩個棧(s,min),棧s存放資料,棧min存放當前所有資料的最小值 2、對於棧s正常入棧,出棧就可以 3、對於棧min,當棧min為空或者入棧的資料x小於等於

資料結構筆記_佇列

一. 棧(Stack) 棧的認識: 棧是一種線性結構; 相比陣列,棧對應的操作是陣列的子集; 只能從一端新增元素,也只能從一端取出元素,這一端稱為棧頂; 棧是一種後進先出的資料結構(Last In First Out:LIFO); 棧看似

綜述 ------ 線性表,字串,佇列

忍不住想給前幾個資料結構進行一下總結。 對於線性表我們分為順序表和連結表,分類的依據是節點的物理儲存關係。順序 表中每個節點其物理儲存關係就表現了它的節點的邏輯關係,即每個節點的儲存 空間都是緊挨著,也就是說一個順序表的物理儲存空間就是一大塊物理儲存空間。 而連結表通過節點間的連結關

LeetCode-佇列總結

棧和佇列 棧和佇列是很重要的資料結構,棧是先進後出,佇列是先進先出,可以用兩個棧實現佇列,也可以用一個佇列實現棧,這些基本操作都應該掌握熟練。 陣列中元素與下一個比它大的元素之間的距離 739. Daily Temperatures (Medium) Input: [73

向量、連結串列、佇列的基本實現

目錄 一、一點感想 二、程式碼 1、Vector 2、 List 3、Stack 4、Queue 三、不足之處 一、一點感想 自學資料結構和演算法到現在時間也不短了,一直猶豫著要不要寫一寫向量等幾個最最基本的資料結構,因為總覺得是最基本的,

Java使用佇列模擬停車場問題

停車場管理: 本題為計算機系專業課資料結構實驗 [問題描述] 設停車場是一個可以停放n輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內按車輛到達時間的先後順序,依次有北向南排列(大門在最南端,最先到達的第一車停放在車場的最北端),若車場內已停滿n輛車,那麼後來的車只能在門外的便道上等候,一旦