首页 > 编程知识 正文

队列和循环队列,链表栈和顺序栈的区别

时间:2023-05-04 21:09:56 阅读:160341 作者:1073

链表、队列和堆栈都是数据结构的一种。 Sartaj Sahni在他的《数据结构、算法与应用》书中写道:“数据结构是一个数据对象,是对象的实例和构成实例的数据元素之间存在的各种联系。 这些联系可以通过定义相关的函数给出。 ”他将数据对象(data object )定义为“一个数据对象是实例或值的集合”。

链表u定义链表(Linked list )是一般的基础数据结构,是线性表,但不是以线性的顺序存储数据,而是在各节点(node )存储数据变量(data )和指针变量(node next ) 头节点) head )连接的链表类常用于存储数据,因为它可以定义添加、删除、插入、遍历和修改等方法。

u优势(1) .使用链表结构可以克服需要提前知道数组链表数据大小的缺点,链表结构可以充分利用计算机的内存空间,实现灵活的内存动态管理。

)2) .对数据的访问往往按不同的顺序进行转换,但链接列表为自指示数据类型。 这是因为它包含指向同一类型的其他数据的指针(链接)。 链表允许插入和删除表中任意位置的节点,但不允许随机访问。

缺点链表失去了随机读取数组的优点,链表增加了节点的指针字段,从而增加了空间开销。

u型主要有单向链表、双向链表及循环链表。

实例(1) .单向链表

(2) .双向链表

使用u和数组(Array )比较链表时,不需要知道数据的大小,但数组必须在创建时指定数组的大小。 链表没有相应的下标,只有指向下一个数据的指针,数组中每个数组都有相应的下标。

链表存储在内存中的数据可以是不连续的,但数组存储的数据占用内存中的连续段,并由标识符标识。

2 .队列u定义队列是一种特殊的线性表,只在表的前端(前端)允许删除操作,在表的后端(后端)允许插入操作。 进行插入操作的端称为排队终端,进行删除操作的端称为排队终端。 如果队列中没有元素,则称为空队列。

在名为队列的数据结构中,最初插入的元素首先被删除。 相反,队列也称为FIFO—first in first out线性表,因为最后插入的元素最后会被删除。

u队列的方法add(e )将指定元素插入该队列,如果它立即可执行且不违反容量限制,则返回true;如果当前没有可用空间,则抛出IllegalStateException。 回到布尔。

element ) )获取不删除此队列的标头,如果此队列为空,则抛出NoSuchElementException并返回到通用e。

出价(e )将指定的元素插入此队列。 在可以立即执行且不违反容量限制的情况下,此方法通常优于无法插入元素并可能抛出异常的add ) e )。 回到布尔。

peek ) )获取不删除此队列的标头,如果队列为空则返回null。 返回通用e。

poll ) )获取并删除此队列的开头,如果此队列为空,则返回null。 返回通用e。

remove ) )获取并删除此队列的开头。 返回通用e。

u队列的使用和伪溢出队列可以用数组Q[1m]存储,数组的上限为m,最大容量为m。 队列运算需要设置两个指针。 队列头指针(head ),指向实际队列头元素的前面位置; 该队列的最后指针(tail )指向实际队列的最后一个元素所在的位置,其中该队列中的元素的数量为:N=tail-head。 两个指针的初始值通常设置为0。 在这种情况下,队列为空,没有元素。

在数组定义Q[110]的情况下,头=2,tail=8。 要使第一个元素退出队列,第一个指针必须加1。 也就是说,如果head=head 1,则头部指针向上移动一个位置,指向q(3),q(3)表示出队。 要将新元素入队,必须将尾部指针上移一个位置。 也就是说,如果tail=tail 1,则q(9)入队。 如果队列的结尾已经在顶部进行处理,即tail=10,并且入队操作也执行时会发生“溢出”,但是由于实际上队列中还有三个空闲位置,所以将该溢出称为“假溢出”

u环队列概念是一种充分利用向量空间,克服“虚假溢出”现象的方法。 将向量空间看作首尾一贯的圆环,将该向量称为循环向量。 其中存储的队列称为Circular Queue。

    循环队列的入队算法:       

    (1). tail=tail+1;     

    (2). 若tail=m+1,则tail=1;        

    (3). 若head=tail尾指针与头指针重合了,判断空或满;       

    (4). 否则,Q[tail]=X,结束(X为新入出元素)。        

    循环队列的出队算法:        

    (1). 若head=tail尾指针与头指针重合了,判断空或满;        

    (2). 若不重合head=head+1;       

    (3). 若head=m+1,则head=1;       

    (4). 移除Q[head],结束。         

    循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。           

    解决这个问题的方法至少有两种:   

     ① 另设一布尔变量以区别队列的空和满;    

     ② 另一种方式就是数据结构常用的:队满时:(tail+1)%n=head,n为队列长度(所用数组大小),由于tail,head均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算。如图情况,队已满,但是tail+1=5+1=6,n=6,求余6%6=0=head。

   u 阻塞队列(BlockingQueue)的概念   Ø  三. 栈         u 定义         

    栈(Stack),是硬件。主要作用表现为一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

    栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。   

   u 栈的方法 

    a)empty()  测试堆栈是否为空。返回boolean。 

    b)peek()     查看堆栈顶部的对象,但不从堆栈中移除它。返回泛型E。  pop()        移除堆栈顶部的对象,并作为此函数的值返回该对象。返回泛型E。

    c)push(E item)   把项压入堆栈顶部。返回泛型E。 

search(Object o)   返回对象在堆栈中的位置,以 1 为基数。返回int。

   u  . 栈的实现              ² 进栈(PUSH)算法     

      1)若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作2));  

      2)TOP=TOP+1(栈指针加1,指向进栈地址);  

      3)S(TOP)=X,结束(X为新进栈的元素);     

    ² 退栈(POP)算法   

      a)若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈,空则下溢;不空则作b));  

      b)X=S(TOP),(退栈后的元素赋给X): 

      c)TOP=TOP-1,结束(栈指针减1,指向栈顶)

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。