線性表 堆疊以及佇列

2021-08-03 14:46:46 字數 3526 閱讀 3114

佇列總結

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

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

線性表的資料結構表示:

class linearlist 

bool isempty()const

bool isfull()const

int length()const

//線性表的訪問函式,其中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);

}

不難看出,線性表的優勢在於隨機訪問的效率高,速度快(因為可以進行索引),而且實現起來較為簡單,但是由於先行表的最大長度固定,所以想要增加線性表的長度並不容易,如果需要進行線性表的長度變化,可以建立乙個新的線性表,並且將原始的線性表中的內容完全複製到新的線性表中,刪除原始線性表即可。

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

class node

node(const

int& item, node *nextnode = null)

void setdata(int data);

int data()

};class linkedlist

linkedlist(int &item);

~linkedlist();

bool isempty()const

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:
堆疊這一概念應該是分開的,堆是堆,棧是棧,兩種不同的東西。

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

在這裡只講棧,不講堆。

順序棧,其實就是用線性表來實現的棧。

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

class astack

~astack()

bool push(const

int &item); //壓棧

bool pop(int &item); //彈棧

bool peek(int &item)const; //讀取棧頂元素

int isempty()const

int isfull()const

void clear()

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

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

class lstack

~lstack()

void clear(); //清空棧

bool push(const

int &item);

bool pop(int &item);

bool peek(int &item);

int isempty()const

}

鏈式棧的優缺點可以與鍊錶結構相似。

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

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

使用順序儲存的方式實現,其主要思想為:

建立乙個線性表,增加兩個指標,分別命名為隊首指標,指向佇列最開始的位置,並且元素由此出隊,隊尾指標,指向當前插入佇列的位置,並且只能向後插入。

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

class aqueue

bool qinsert(const

int &item); //向隊尾插入元素

bool qdelete(int &item); //刪除隊首元素

void qclear()

int qfront()const; //讀取隊首元素

bool isempty()const

bool isfull()const

}

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

class lqueue

~lqueue()

void qinsert(const

int &item);

bool qdelete(int &item);

bool qfront(int &item);

int isempty()const

void qclear();

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

資料結構是計算機開發中最為重要的一門知識,可以說,只要是程式設計,就會用到資料結構。

本文僅僅是資料結構的冰山一角,但是隨著程式設計的深入,你會發現,這冰山一角卻是冰山最重要的基礎。

資料結構的定義很廣,包括使用c語言或是其他語言編寫乙個小的struct結構體,都可以被視為一中資料結構。

還是那句話,所有複雜的事物,都是由簡單的符號所組成的。

線性表 佇列

和棧相反,佇列是一種先進先出 first in first out 縮寫為fifo 的線性表。它只允許在表的一端進行插入,而在另一端刪除元素。雙端佇列 限定插入和刪除操作在表的兩端進行的線性表 單鏈佇列 佇列的鏈式儲存表示 和線性表類似,佇列也可以有兩種儲存表示。用鍊錶表示的佇列簡稱鏈佇列。type...

試用多型實現線性表(佇列,串,堆疊)

佇列,串,堆疊都可以實現push,pop,測長等操作,用多型實現,就是建立乙個線性表的共性模板 includeusing namespace std 試用多型實現線性表 佇列 串 堆疊 templatestruct tcontainer templatestruct tvector public t...

資料結構之線性結構 線性表,堆疊,佇列

對於線性表的操作 1 建立線性表 2 確定線性表的長度 3 確定線性表是否為空 4 訪問表中指定位置的節點的值 5 查詢指定值在表中的位置 6 在表中指定位置插入乙個新節點 7 刪除表中指定位置的節點 2.線性表的鏈結儲存結構 用鏈結方式儲存的線性表稱為鍊錶。優點 不必調整節點的位址,儲存單元對儲存...