顺序存储(顺序表):逻辑上相邻的两个元素在物理位置上也相邻
链式存储(链表):不要求逻辑上相邻的两个元素在物理位置上也相邻
单链表
双链表
循环单链表
循环双链表
静态链表:借助数组描述线性表的存储结构,节点有数据域data和指针域next(游标,指节点的相对地址),静态链表也要预先分配一块连续的内存空间
二、操作受限的线性表:只允许在一端进行插入或删除操作的线性表
栈顶指针:栈顶指针初始时设置S.top=-1;栈顶元素:S.data[S.top]
进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素( S.data[++S.top] = x )
出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针减1( x = S.data[S.top--] )
栈空条件:S.top== -1;栈满:S.top==MaxSize-1;栈长:S.top+1
共享栈:为了更有效地利用存储空间,让两个顺序栈共享一个一维数组
链栈:通常采用单链表,并规定所有操作都在表头进行,一般规定链栈没有头结点,Lhead指向栈顶元素
顺序队列:附设头指针front指向队头元素,rear指向队尾元素的下一个元素
初始化:Q.front=Q.rear=0
入队:队不满时,先送值到队尾元素,再将队尾指针加1
出队:队不满时,先取队头元素值,再将队头指针加1
缺点:会出现“假溢出”
初始化:Q.front=Q.rear=0
入队:队不满时,让队尾指针加1取模 Q.rear=(Q.rear+1)%MaxSize
出队:队不满时,再让队头指针加1取模 Q.front=(Q.front+1)%MaxSize
队空:Q.front=Q.rear
①牺牲一个单元区分对空和队满,队满条件:(Q.rear+1)%MaxSize==Q.front
②类型中增设表示元素个数的数据成员size。队空:Q.size==0;队满:Q.size==MaxSize
③类型中增设tag数据成员。对空:tag=0;队满:tag=1
队空:Q.front==NULL且Q.rear==NULL
入队出队同单链表
适用场合:数据元素变动比较大,且不存在队列满且产生溢出的问题。如要适用多个队列,多个栈的情形
输出受限:允许再一端进行插入和删除,在另一端只允许插入
输入受限:允许再一端进行插入和删除,在另一端只允许删除