1. 程式人生 > >線性表、堆疊以及佇列

線性表、堆疊以及佇列

線性表、連結串列以及佇列是在coding中最為常見的資料結構,在平時程式設計時,我們會有意識或無意識的進行選擇。

1. 線性表

線性表本質上是一種順序儲存結構,所有需要儲存的內容是可以被索引的,說起來,在程式設計時常用的陣列就是線性表的一種。
線性表的資料結構表示:

class LinearList 
{
    private:
        int MaxSize;      //線性表的最大尺寸
        int length;     //線性表的實際長度
int *element; //儲存線性表的陣列 //一般使用模板來代替int定義,這裡為了方便,使用int public: //線性表的建構函式,預設最大尺寸為10 LinearList(int MaxSize = 10); ~LinearList() { delete[] element; } bool IsEmpty()const { return length == 0; } bool IsFull()const { return length == MaxSize; } int
Length()const { return length; } //線性表的存取函式,其中k表示索引號,item表示存取的資料值 bool Find(int k, int &item)const; int Search(const int &item)const; void Delete(int k, int &item)const; void Insert(int k, const int &item); }

不難看出,線性表的優勢在於隨機訪問的效率高,速度快(因為可以進行索引),而且實現起來較為簡單

,但是由於先行表的最大長度固定,所以想要增加線性表的長度並不容易,如果需要進行線性表的長度變化,可以建立一個新的線性表,並且將原始的線性表中的內容完全複製到新的線性表中,刪除原始線性表即可。

2. 連結串列結構

連結串列彌補了線性表的缺點,但是又增加了新的問題。看如下例程:

class Node
{
    private:
        int data;   //資料域,一般為模板類
        Node *next; //指向下一個結點
    public:
        Node(Node *nextNode = NULL) { next = nextNode; }
        Node(const int& item, Node *nextNode = NULL)
            { data = item;  next = nextNode; }
        void setData(int data);
        int Data() { return data; }
};

class LinkedList
{
    private:
        Node *head;  //頭指標
    public:
        LinkedList() { head = new Node(); }
        LinkedList(int &item);
        ~LinkedList();

        bool IsEmpty()const { return head->next == NULL; }
        int Length()const; //返回連結串列長度

        //這裡的實現多種多樣,此下幾個函式為其中一種
        //通過遍歷連結串列找到第k個元素,將該元素賦值給item
        bool Find(int k, int &item)const;
        int Search(int k, int &item)const;
        void Delete(int k, int &item)const;
        void Insert(int k, const int &item);
}

該程式結點只是連結串列的一種,單向連結串列。還有其他如,迴圈連結串列,雙向連結串列,十字連結串列等等。
迴圈連結串列中最後的一個元素的後繼結點為表頭結點,雙向連結串列中每個元素有兩個指標,分別指向其前驅結點與後繼結點。

Tip:
前驅結點:對於某一個結點來說,所有指向該結點的結點,就是該結點的前驅結點。
後繼結點:對於某一個結點來說,該結點所指向的下一個結點,就是該節點的後繼結點。

3. 堆疊

堆疊這一概念應該是分開的,堆是堆,棧是棧,兩種不同的東西。
棧的基本組成為棧頂指標,壓棧,彈棧動作,並且只能對棧頂元素進行讀寫操作,。其邏輯結構是先進棧的元素後讀出,後進入的元素先讀出,我們可以稱之為後來居上的原則(LIFO)。棧也僅僅是一種概念,其實現是由其他基本資料結構完成的。

在這裡只講棧,不講堆。

3.1 順序棧

順序棧,其實就是用線性表來實現的棧。
順序棧的主要思想是:建立一個線性表,棧頂指標為索引號,其值為當前棧頂的索引號,壓棧和彈棧的動作僅僅是對棧頂指標的值進行賦值和清除。

class AStack
{
    private:
        int size;     //線性表的長度
        int *stackArray;    //存放棧頂元素的陣列
        int top;    //棧頂指標
    public:
        AStack(int MaxStackSize = 10)
        {
            size = MaxStackSize;
            stackArray = new int[MaxStackSize];
            top = -1;
        }
        ~AStack()
        { delete[] stackArray; }

        bool Push(const int &item);   //壓棧
        bool Pop(int &item);     //彈棧
        bool Peek(int &item)const;      //讀取棧頂元素
        int IsEmpty()const { return top == -1; }
        int IsFull()const { return top == size - 1; }
        void clear() { top = -1; }

順序棧的優勢與線性表的優勢相同,都是實現簡單,效率高,缺點也是不易對棧進行擴充。

3.2 鏈式棧

聽名字就知道了,這種棧是以連結串列儲存結構實現的。

class LStack
{
    private:
        Node *top;   //指向棧頂指標
    public:
        LStack() { top = NULL; }
        ~LStack() { clear(); }
        void clear();   //清空棧

        bool Push(const int &item);
        bool Pop(int &item);
        bool Peek(int &item);
        int IsEmpty()const { return top == NULL; }
}

鏈式棧的優缺點可以與連結串列結構相似。

4. 佇列

佇列和堆疊的性質較為類似,只是佇列採取的原則是,先進先出原則(FIFO)。在佇列中所有的操作均只能對隊首與隊尾進行,而在實現上,也分為順序佇列以及鏈式佇列。

這種原則和日常排隊相像,先到先得。

4.1 順序佇列

使用順序儲存的方式實現,其主要思想為:
建立一個線性表,增加兩個指標,分別命名為隊首指標,指向佇列最開始的位置,並且元素由此出隊,隊尾指標,指向當前插入佇列的位置,並且只能向後插入。

其實佇列還可以增加一個指標,用於遍歷佇列中的元素,但是這樣做就破壞了佇列操作的原則,使佇列退化成了一個簡單的線性表。

class AQueue
{
    private:
        int front;     //隊首
        int rear;     //隊尾
        int count;    //佇列元素個數
        int *QArray;   //佇列陣列
        int size;    //佇列大小
    public:
        AQueue(int MaxQueueSize = 10);
        ~AQueue() { delete[] QArray; }

        bool QInsert(const int &item);    //向隊尾插入元素
        bool QDelete(int &item);     //刪除隊首元素

        void QClear() { front = rear = count = 0; }
        int QFront()const;    //讀取隊首元素
        bool IsEmpty()const { return count == 0; }
        bool IsFull()const { return count == size; }
}

4.2 鏈式佇列

思想和順序佇列類似,實現如下:

class LQueue
{
    private:
        Node *front, *rear;
    public:
        LQueue() { front = rear = NULL; }
        ~LQueue() { QClear(); }

        void QInsert(const int &item);
        bool QDelete(int &item);
        bool QFront(int &item);

        int IsEmpty()const { return front == NULL; }
        void QClear();

無論是堆疊還是佇列,上述幾種都是較為基礎的形式,關於堆疊和佇列,還有其相應的擴充套件,如雙端佇列,雙棧,超佇列,超棧等等。

5. 總結

資料結構是計算機開發中最為重要的一門知識,可以說,只要是程式設計,就會用到資料結構。
本文僅僅是資料結構的冰山一角,但是隨著程式設計的深入,你會發現,這冰山一角卻是冰山最重要的基礎。

資料結構的定義很廣,包括使用C語言或是其他語言編寫一個小的struct結構體,都可以被視為一中資料結構。
還是那句話,所有複雜的事物,都是由簡單的符號所組成的。

相關推薦

線性堆疊以及佇列

線性表 連結串列結構 堆疊 1 順序棧 2 鏈式棧 佇列 1 順序佇列 2 鏈式佇列 總結 線性表、連結串列以及佇列是在coding中最為常見的資料結構,在平時程式設計時,我們會有意識或無意識的進行選擇。 1. 線性表

線性堆疊佇列的特點,及程式碼實現(C語音)

一、線性表: 線性表定義:線性表是n個數據元素的有限序列線性表有多種實現方式,線性、鏈式等,其中線性實現採用隨機儲存的方式:(線性)(鏈式)具體的說明大家可以看書對吧,這裡直接貼出實現C語言程式碼(下面是鏈式儲存實現):#include<stdio.h> #inc

資料結構—線性結構(線性棧與佇列

3.3 線性表的抽象資料型別ADT 線性表的抽象定義 集合A和集合B的並集操作 3.4 線性表的順序儲存結構 線性表的順序儲存的結構程式碼 地址計算 3.5 順序儲存結構的插入與刪除 獲得元素操作 GetElem 插入操作 ListInsert 刪除

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

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

【資料結構】資料結構總結之線性棧和佇列

如果你覺得對你有幫助的話,希望可以star/follow一下喲,我會持續保持更新。 資料結構總結之線性表、棧和佇列 資料結構的課程結束了兩年,當時整理的手寫筆記弄丟了,回頭來看書,發現很多知識點已然生疏,準備寫幾篇博文整理一下。 一、線

陣列連結串列堆疊佇列線性和順序

線性表是具有n個(資料元素)的有限序列(n>0) 資料:資訊的載體,能夠被計算機識別、儲存、加工,包括整數、實數、字串、影象、聲音等 資料元素:資料的基本單位,也稱結點、元素、頂點(圖)、記錄。一個數據元素可由若干個資料項組成,比如線性表中每個資料元素由姓名、

第二章之線性佇列線性

線性表的儲存結構(主要有兩種): 1、定長的順序儲存結構,也稱順序表或向量型的一維陣列結構。資料結點之間的邏輯關係是通過資料結點的儲存位置來反映的。 2、邊長的線性結構儲存結構、大多實現為連結式儲存結構。資料結點之間的邏輯關係是以指標來表示的。 兩者的比較 1、順序表的主要優點體現在沒有使用指標,節省

JAVA 線性佇列和優先佇列

線性表、棧、佇列和優先佇列 資料結構是以某種形式將資料組織在一起的合集。資料結構不僅儲存資料,還支援訪問和處理資料的操作。 JAVA的合集框架如下圖所示 合集 JAVA合集框架支援兩種型別的容器: 一種是儲存一個元素合集,簡稱合集。 另一種是為了儲存鍵、值對,稱

線性連結串列佇列的關係

一、前言     程式設計師在程式設計實戰操作面前有兩個攔路虎,第一個是用遞迴的思想去解決問題,第二個是資料結構與演算法的應用。對於遞迴,由於其神奇的薄面紗總是然我們覺得難以理解,而大多數遞迴解法還是需要承擔一定的計算負擔的,因此我覺得能理解其思想與用法固然好,但是實在無法

線性佇列的的順序儲存和鏈式儲存

先概括一下線性表順序儲存和鏈式儲存。 線性表的順序儲存是用一組地址連續的儲存單元依次儲存線性表的資料元素。 線性表的鏈式儲存是用指標將儲存線性表中的資料元素的那些單元依次串聯在一起。 接下來圖片說明。

線性佇列的鏈式儲存結構

一、順序儲存結構與鏈式儲存結構的區別        順序儲存就是從記憶體中取出一段連續地址的空間,將資料依次連續的儲存在這段空間中。而鏈式儲存結構是指資料儲存在記憶體中的地址是離散的,以資料節點為單

線性佇列和棧

集合操作------線性表1、 List2、 List的排序3、 佇列和棧List:1、 get和setList除了繼承Collection定義的方法外,還根據其線性表的資料結構定義了一系列方法,其中最常用的就是基於下表的get和set方法:--E get(int index

輸入IAT以及輸出

logs span 註意 文件中 bsp nba 導出表 tab .cn 輸入表、IAT表與輸出表 ImportTable : 00002010 RVA to FOA 所以輸入表在文件中的地址為 2010 - 2000 + 600

線性棧基本操作

線性表:順序表(陣列)、連結串列 棧:插入和刪除都限制在表的同一端進行(後入先出) 佇列:插入在一端,刪除在另一端(先進先出) 線性表基類: 增:append(val)   insert(p,val) 刪:delete(p) 改:setValue(p,

資料結構-線性(棧與佇列基本概念)

棧(stack,zhan):是限定僅在表尾進行插入和刪除操作的線性表。 把允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),不含任何資料元素的棧稱為空棧。棧又稱為後進先出(Last In First Out)的線性表,簡稱LIFO結構。 棧是一個線性表,棧元素

資料結構中 線性,棧,佇列,演算法之間的聯絡與區別

一。連結串列為什麼需要         在程式中,經常需要將一種(通常是同為某個型別的)資料元素作為整體管理和使用,需要建立這種元素組,用變數記錄他們,傳進傳出函式等。一組元素可能發生變化(像增加或刪除元素。)      

數據結構之線性隊列

remove const rpo end delet get amp list etop 溫故而知新~~~~ 一、線性表 順序表實現(C++) 1 template<typename E> 2 class AList 3 { 4 private:

資料結構_線性_棧_佇列的(面向介面)實現_Unit_1;

Topic 1:線性表 package lanqiao; /** * 線性表的介面 * 我們的這個介面為順序儲存的線性表服務 * 我們進行面向介面的程式設計 * @author wangtong * */ public interface List { //

第二章之線性隊列和線性

根據 取出 指針 插入 特殊性 邏輯 排序 存儲結構 mar 線性表的存儲結構(主要有兩種): 1、定長的順序存儲結構,也稱順序表或向量型的一維數組結構。數據結點之間的邏輯關系是通過數據結點的存儲位置來反映的。 2、邊長的線性結構存儲結構、大多實現為鏈接式存儲結構。數據結點

資料結構實驗1— 線性連結串列的實現

約瑟夫環問題 實驗要求 問題描述 基本要求 測試資料 程式程式碼 執行結果 實現順序表各種基本操作 實驗要求 編寫程式實現順序表的各種基本運算,並在此基礎上設計一個主程式完成如下功能: (1)初始化順序表L; (2)依次在L