1. 程式人生 > >基本數據結構理解

基本數據結構理解

最大 數據 arr 鏈表 stack next turn 靜態鏈表 有一種

基本的數據結構小結,用數組代替指針

鏈表

技術分享

鏈表和數組最大的不同是擁有 next值 並且各點在內存中彼此分散與內存的物理順序無關。如果為a[5]={1,2,3,4,5};這時候每個值是按照順序的排列 。

如果是a[5]={1,2,3,5,4};按照下標輸出則是 1 2 3 5 4,此時用鏈表存儲,a[4](值為4)的next標記為3,則輸出a[a[4].next]的值就是5,而數組中值的位置都沒有變化,給每個值都存儲下一個值,可以按序輸出。

靜態鏈表

struct node
{
int value;
intnext;
}arr[MAX];
int top;//鏈表頂端
//插入
top++;
arr[top].value=q;
arr[top].next=arr[p].next;
arr[p].next=top;
//刪除
int temp=a[p].next;
a[p].next=a[temp].next;
//查找.遍歷
int temp=head;
while(temp)
{
cout<<a[temp].value;
temp=a[temp].next;
}

鏈表還有一種叫做雙向鏈表,比剛才靜態(單)鏈表多了一個前驅(prev)。這樣不管是插入還是刪除,都需要維護好三個關系, 這個數的本值,前驅,後繼。並且雙向鏈表的查找或遍歷是可以從兩個方向開始的。當向一個鏈表中插入數據的時候,不需要再數組中位置緊密排列,而記住前驅後繼的序號即可,這種方法比騰出一位數組要方便的多。

循環鏈表,最後一個值的next和第一個值相同,第一個值的prev和最後一個值相同,構成了一個環。

技術分享

棧的存儲特性:先進後出,先出後進。top表示棧頂,也就是每次數據進、出棧的時候top都會改變,top也表示一個棧中數據的多少。

技術分享技術分享

int stack[N],top=0;

inline void push(int a){stack[++top]=a;}//入棧

技術分享

intline int pop(){return stack[--top];}//出棧

技術分享

inline bool empty(){return top<1;}//棧空

一般存儲棧的題目會考察單調棧,單調棧中元素的值是按照升序或者降序排列的,所以在存入的時候會和stack[top]的值比較。例如 stack[5]={1,2,5,6},此時存入的top=3,stack[top]的值是6,如果把3存入,則需要刪除值5和6,通過比較的出5、6比3大,top--(連續兩次),此時top為1,然後存入stack[top++]的值是3

基本數據結構理解