问题一中说了堆栈和堆的不同, 现在我们看一下数据结构。
线性表是有限个数据元素的序列。线性表的存储有顺序存储和链式存储两种。
线性表的顺序存储是指用一组地址连续的存储单元以此存储线性表的元素。两个逻辑相邻的元素在物理上也是相邻的,能够快速取得指定索引的元素;但插入、删除元素时需要移动元素,效率较低;存储区是连续的,长度一般不能在原存储区的基础上扩大,扩大存储区需要复制原来的元素。
与顺序表相比,链表有自己的特点:插入、删除操作无需移动元素;能够高效实现动态内存分配;但不能按节点索引快速定位到节点;由于需要记录指针域,系统开销较大。
双链表每个数据节点都有两个指针,分别指向其后继和前驱节点。与单链表只能访问其后继结点相比,具有更大的灵活性;当然占用更多的存储空间。
前面的单链表和这里的双链表都使用了空的头结点或称哑节点,目的是实现有序链表时更方便。
循环链表可以是单链表,也可以是双链表。链表的尾节点的后继节点指向头结点便成了循环链表。 我们在这里继承双链表实现循环链表,当到达双链表的表尾时,让游标指向第0个节点;当到达双链表的开头时,让游标指向结尾节点,这样就实现了循环双链表。
队列的特点是先进先出,如同日常生活中的排队。队列有加入队尾,从队头删除元素,取得队尾元素,取得队头元素,取得队列长度,判断队列是否为空等操作。
队列也可以可以用顺序表、链表实现,但队列最好不要用顺序表实现,因为元素加入队列和删除元素中的一种操作总会引起全部元素的移动,效率极低(循环队列除外)。
堆栈是一种后进先出的数据结构,在某些程序设计中经常用到。堆栈只能取得栈顶元素、压栈、出栈、取得栈内元素数量及判断是否为空等操作。