链表、队列和堆栈都是数据结构的一种。 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,指向栈顶)