数据结构概括——链表,栈,队列

来源:互联网 发布:淘宝怎么修改认证信息 编辑:程序博客网 时间:2024/05/16 01:21


数据结构

线性表
定义:
定义n个数据元素的有限序列,记作(a1, a2, …, an)ai 是表中数据元素,n 是表长度
特点:
除第一个元素外,其他每一个元素有一个且仅有一个
直接前驱。
除最后一个元素外其他每一个元素有一个且仅有一个
直接后继。

顺序表
定义 :  将线性表中的元素相继存放在一个连续的存储空间中。
特点 :  线性表的顺序存储方式
遍历   顺序访问, 可以随机存取    

链表
特点:每个元素(表项)由结点(Node)构成,线性结构,结点可以连续,可以不连续存储, 结点的逻辑顺序与物理顺序可以不一致,表可扩充


顺序表与链表的比较
基于空间的比较:
存储分配的方式  顺序表的存储空间是静态分配的,链表的存储空间是动态分配的
存储密度 = 结点数据本身所占的存储量/结点结构所占的存储总量
顺序表的存储密度 = 1,链表的存储密度 < 1
基于时间的比较:
存取方式   顺序表可以随机存取,也可以顺序存取,链表是顺序存取的
插入/删除时移动元素个数  顺序表平均需要移动近一半元素,链表不需要移动元素,只需要修改指针,若插入/删除仅发生在表的两端,宜采用带尾指针的循环链表




栈是一个特殊的线性表,只能在一端操作;

栈顶(top):允许操作 的一端;

栈底(bottom):不允许操作的一端

性质:先进后出
1.栈:是限定仅在表尾进行插入和删除操作的线性表;又称后进先出的线性表。LIFO结构。
    

2. 空栈:不含任何数据元素的栈;top=-1;

3. 栈的操作:进栈,压栈,入栈:栈的插入操作;
  
出栈,弹栈:栈的删除操作;
  
栈中有一个元素时,top=0;


4. 栈的抽象数据类型:
插入和删除:push,pop  同线性表。元素具有相同的类型,相邻元素具有前驱和后继的的关系。
 
操作:
 
a.初始化操作,建立空栈S;
 
b. 若栈存在,就销毁它;
 
c.将栈清空;
 
d.判断栈是否空:空返回true,否则返回false;
 
e. 若栈存在非空,用e返回s的栈顶元素;
 
f. 若栈S存在,插入新元素e到栈s成为栈顶元素;
 
g.删除栈s栈顶元素,并用e返回其值;
 
h.返回栈s的元素个数。
5. 若存储栈的长度为StackSize,则栈顶位置top必须小于StackSize。
 
若栈存在一个元素,top=0;
 
空栈的条件:top=-1;

栈的结构:
 
typedef  struct sqStack{
     
int data[MAXSIZE];
     
int top;
 
}STACK;


栈的链式存储结构
 
栈的链式存储结构,简称为链栈;
 
栈顶放在单链表的头部;
 
链栈是不需要头结点的;
 
链栈不存在栈满的情况。
空栈的时候,链表原定义是头指针指向空。即top=NULL


队列
队列是特殊的线性表;
队列仅在线性表两端进行操作;

队头(Front):取出数据的一端;

队尾(Rear):放入数据的一端;

性质:先进先出
a.队列的抽象数据模型:
  
1)初始化操作,建立一个空队列Q;
  
2)若队列存在,则销毁它;
  
3)将队列清空
  
4)若队列Q为空,返回true,否则返回false;
  
5)若队列Q存在且非空,用e返回队列Q的队头元素;
  
6)若队列Q存在,插入新元素e到队列Q中,并成功称为队尾元素;
  
7)删除队列Q中队头元素,并用e返回其值;
  
8)返回队列Q的元素个数;
b.循环队列:
  
1.队列顺序存储的不足:
  
避免出现只有一个元素时,队头和队尾的重合处理麻烦,引入front指向队头元素,rear指向队尾元素的下一个位置;front=rear时,队列不是还剩一个元素,而是空队列;

2.循环队列定义:
  
把头尾相接的顺序存储结构称为循环队列;
  
判断队列满的条件:
(rear+1)%QueueSize==front;
  
通用的计算队列长度公式为:
(rear-front+QueueSize)%QueueSize;

typedef  struct {
      
int data[MAXSIZE];
      
int front;
      
int rear;
  
}SqQueue;
 

原创粉丝点击