码迷,mamicode.com
首页 > 其他好文 > 详细

线性数据结构

时间:2018-12-19 21:00:50      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:src   html   color   pre   logs   stack   单链表   htm   net   

什么是数据结构?

  数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

举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())

 

 

线性数据结构

标签:src   html   color   pre   logs   stack   单链表   htm   net   

原文地址:https://www.cnblogs.com/tflsnoi/p/10145450.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!