佇列總結
線性表、鍊錶以及佇列是在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.線性表的鏈結儲存結構 用鏈結方式儲存的線性表稱為鍊錶。優點 不必調整節點的位址,儲存單元對儲存...