队列、栈和堆

队列:什么是队列?又该怎么理解呢?

  • 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front) 进行删除操作,而在表的后端(rear)进行插入操作,和栈一样, 队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
  • 队列中没有元素时,称为空队列。
  • 建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间, 并设置两个指针进行管理。一个是队头指针front, 它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。
  • 队列采用的FIFO(first in first out),新元素(等待进入队列的元素) 总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取。 每次读取一个元素,释放一个元素。所谓的动态创建,动态释放。 因而也不存在溢出等问题。由于链表由结构体间接而成,遍历也方便。(先进先出)

队列的方法,列举如下:

入队,q.push(x)
出队,q.pop()
访问队首元素,q.front()
访问队尾元素,q.back()
判断队列空,q.empty()
访问队列中的元素个数,q.size()

栈:什么是栈?又该怎么理解呢?

  • 栈(stack)又名堆栈,它是一种运算受限的线性表。 其限制是仅允许在表的一端进行插入和删除运算。 这一端被称为栈顶,相对地,把另一端称为栈底。
  • 栈就是一个桶,后放进去的先拿出来, 它下面本来有的东西要等它出来之后才能出来(先进后出)
  • 栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程) 为这个线程建立的存储区域,该区域具有FIFO的特性, 在编译的时候可以指定需要的Stack的大小。

栈的相关方法:

入栈,s.push(x)
出栈,s.pop()
访问栈顶,s.top()
判断栈空,s.empty()
访问栈中的元素个数,s.size()

堆:什么是堆?又该怎么理解呢?

  • 堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:

    • 堆中某个节点的值总是不大于或不小于其父节点的值;

    • 堆总是一棵完全二叉树。

  • 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。 常见的堆有二叉堆、斐波那契堆等。

  • 堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。 即动态分配内存,对其访问和对一般内存的访问没有区别。

  • 堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。

  • 堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。

栈和队列的区别:

  1. 栈是先进后出。队列是先进先出。

  2. 栈只允许在一端进行插入和删除,队列则在表的一段插入另一端删除。

  3. 在栈中遍历数据需要扫描全部数据,所以比较慢。而在队列中可以从两端进行所以速度比较快。

栈和堆的区别:

  1. 栈区由编辑器自动分配释放,速度仅次于CPU,存放对象的物理地址,而堆区存放变量和方法并产生物理地址给栈区。

  2. 栈的数据结构:一种先进后出的数据结构。堆的数据机构:可以看做一棵树。


results matching ""

    No results matching ""