线性数据结构
Posted tflsnoi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性数据结构相关的知识,希望对你有一定的参考价值。
什么是数据结构?
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
举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 }
③循环链表
④双向链表
参考代码: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())
以上是关于线性数据结构的主要内容,如果未能解决你的问题,请参考以下文章