1. 程式人生 > >線性數據結構

線性數據結構

技術分享 splay type p s div 循環鏈表 一個 特點 指針

什麽是數據結構?

  數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索算法和索引技術有關。

舉3個例子:

  • 食堂排隊打飯,每個人與前後人之間的關系

  • 計算機的目錄結構

  • 手機導航軟件如何存儲位置

一、線性數據結構

  線性數據結構的特點:

  • 存在唯一的一個被稱作“第一個”的數據元素
  • 存在唯一的一個被稱作“最後一個”的數據元素
  • 除第一個以外,集合中的每個數據元素均只有一個前驅
  • 除最後一個以外,集合中的每個數據元素均只有一個後繼

  【思考 一元多項式f(x)=a0

+a1x+···an-1xn-1+anxn在計算機中如何表示?

        計算機如何運算5-4*3+2

  1.線性表的存儲結構

    線性表就像火車,按照儲存結構分為:順序表和鏈表

①順序表:用數組存儲,插入和刪除數據元素的時間復雜度都為O(n)

②單鏈表:

  包括兩個域信息,數據域和指針域,可以用指針來實現也可以用數組來模擬。

  用數組模擬鏈表需要註意:(1)元素數組Value[] (2)後繼數組Next[] (3)頭指針Head

  查詢元素時間復雜度為O(n),插入和刪除數據元素的時間復雜度都為O(1)

技術分享圖片
 1 //用單鏈表實現線性表:獲得存儲位置、插入新元素、刪除元素 
2 #include<iostream> 3 using namespace std; 4 int n, Value[2001], Next[2001], Head=0; 5 int GetPos(int pos)//求鏈表第i個元素的存儲位置 6 { 7 int hd=Head; 8 for(int i=1; i<=pos; i++)hd=Next[hd]; 9 return hd; 10 } 11 12 void InsertValue(int pos, int val)//在第pos個元素前插入新元素val 13 { 14 int p=GetPos(pos-1
); 15 Value[++n]=val; 16 Next[n]=Next[p]; 17 Next[p]=n; 18 } 19 20 void DeleteValue(int pos)//刪除第pos個元素 21 { 22 int p=GetPos(pos-1); 23 Next[p]=Next[Next[p]]; 24 } 25 26 int main() 27 { 28 int m; 29 cin>>n; 30 for(int i=1; i<=n; i++) 31 { 32 cin>>Value[i]; 33 Next[i-1]=i; 34 } 35 cin>>m; 36 for(int i=1; i<=m; i++) 37 { 38 int type, pos, val; 39 cin>>type>>pos; 40 if(type==1)cout<<Value[GetPos(pos)]<<endl; 41 if(type==2){cin>>val; InsertValue(pos,val);} 42 if(type==3)DeleteValue(pos); 43 } 44 }
View Code

③循環鏈表

④雙向鏈表

參考代碼:http://www.cnblogs.com/ivanovcraft/p/9037475.html

2.隊列

  由三個部分構成:(1)順序表q[m](2)隊首指針front(3)隊尾指針rear

  隊列的基本操作(手寫):

    • 隊列初始化:front=rear=0
    • 判斷隊列是否為空  
    • 判斷隊列是否已滿
    • 進隊(插入元素X)
    • 出隊
    • 隊列中元素個數:rear-front

  循環隊列的基本操作:

    • “隊列的初始化”與“判斷隊列是否為空”與隊列是一樣的
    • 判斷隊列是否已滿:如果(rear+1)%m==front即rear下一位置是front,則隊列已滿。這種情況下,循環隊列q[m]最多只能存儲m-1個元素
    • 進隊(插入元素x):如果隊列未滿,則執行q[rear]=x;rear=(rear+1)%m.
    • 出隊:如果隊列不為空,則返回隊首元素q[front]同時front=(front+1)%m
    • 隊列中元素的個數:(rear-front+m)%m

  隊列的STL操作:

    • queue<int> q;//定義一個存放整形數據的隊列
    • q.empty();//bool判斷隊列是否為空
    • q.push(x);// x進隊
    • q.pop();//出隊
    • q.size();//隊列大小
    • q.front();//返回隊首元素

  3.棧

  【思考】計算機如何運算5-4*3+2?

      中綴算術表達式》》後綴算術表達式

  棧的基本操作:

    • 初始化:top=0;stack[m]只能存儲m-1個元素?
    • 進棧:如果棧不滿,則stack[++top]=item (s.push(item))
    • 出棧:如果棧不為空,則item=stack[top--];即執行出棧操作時要保證棧中有元素(s.pop())

線性數據結構