线性表
(1)顺序表
基本思想:元素的存储空间是连续的。在内存中是以顺序存储,内存划分的区域是连续的。存储结构如下图:
(2)链表
基本思想:元素的存储空间是离散的,单独的(物理),它们可以通过在逻辑上指针的联系使得它成为了整体的链表。存储结构如下图:
1.单链表
2.循环链表
3.双链表(双向循环表)
顺序表和链表的对比:
队列 --- 先进先出(FIFO)
(1)顺序队列
1)队空:head = tail
2)队满:tail = m
(2)循环队列
1)队空:head = tail
2)队满:tail + 1 = head
栈 --- 后进先出(LIFO)
常见操作
1、入栈(队)
2、出栈(队)
3、判空
4、判满
5、初始化
6、获取队列(栈)大小
堆与栈的区别
一、程序的内存分配
-
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
-
堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
-
全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的
全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另
一块区域。 - 程序结束后由系统释放。
-
文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
-
程序代码区—存放函数体的二进制代码。
二、从管理方式来讲
-
对于栈来讲,是由编译器自动管理,无需我们手工控制;
-
对于堆来说,释放工作由程序员控制,容易产生内存泄露(memory leak)
三、从申请大小大小方面讲
-
栈空间比较小
-
堆控件比较大
四、从数据存储方面来讲
- 栈空间中一般存储基本类型,对象的地址
- 堆空间一般存放对象本身,block的copy等