线性表
一、线性表的顺序存储
1、线性表采用顺序存储,必须占用一片连续的存储单元;
2、线性表顺序存储结构是一种随机存取的存储结构;
3、顺序表在查找指定序号的元素、读取元素和在末尾插入元素最节省时间;
4、顺序表中,在任何一个位置插入元素的概率相同,则插入一个元素所需移动的元素平均数——(n+1)/2;
5、顺序表中,在任何一个位置删除元素的概率相同,则插入一个元素所需移动的元素平均数——(n-1)/2;
二、线性表的链式存储
1、线性表采用链式存储,不必占用一片连续的存储单元,连续与否均可;
2、线性表采用链式存储,便于进行插入和删除操作;
3、顺序查找不论在顺序线性表中还是在链式线性表中的时间复杂度——O(n);
4、单链表中,增加一个头结点的目的是为了方便运算实现;
5、设一个有序单链表中有n个结点,插入一个新结点,单链表依然有序的时间复杂度为——O(n);
6、没有头结点的单链表,头指针变量为head,判空的条件——head==0;有头结点,判空的条件——head->next==0;
三、线性表的应用
1、栈与队列
①栈和队列的共同点是在端点处插入和删除元素
②栈的插入和删除操作都是在栈顶进行
2、栈——限定只在表的一端(表尾)进行插入和删除操作的线性表;
允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),这一端被固定。
1)存储结构:
①顺序存储对应一组操作:顺序栈
顺序栈(S)的相关考点
a、顺序栈为空条件——S->top ==-1;
b、顺序栈为满条件——S->top == Maxsize-1;
c、栈顶指针为top,将元素e入栈——{*S->top = e;S->top++}
d、顺序栈中压入新元素,应当先移动栈顶指针,再存入元素
e、顺序栈中进行退栈操作时,先取出元素,后移动栈顶指针
f、假定利用数组 a[n]顺序存储一个栈,用 top 表示栈顶指针,用 top==n+l 表示栈空,该数组所能
存储的栈的最大长度为 n,则表示栈满的条件是top == 1
g、栈 S 和队列 Q 的初始状态为空,元素 a,b,c,d,e,f 依次通过栈 S,一个 元素出栈后即进队列 Q,
若 6 个元素出队的序列是 a,c,f,e,d,b,则栈 S 的容量至少应该是4
h、若一个栈的输入序列为 1,2,3,…,n,输出序列的第一个元素是 i, 则第 i 个输出的元素是不确定的
i、设有一个栈,元素依次进栈的顺序为 A、B、C、D、E。不可能的出栈序列是:E,A,B,C,D
②链式存储对应一组操作:链栈
链栈的相关考点
a、向一个栈顶指针为 h 的带头结点的链栈中插入指针 s 所指的结点时, 应执行(s->next=h->next ;h->next=s )操作
b、只有表头指针没有表尾指针的循环单链表是最不适合用作链栈的链表
2)特性:后进先出
3、队列——限定在表的一端(队头front)进行删除,在表的另一端(队尾rear)进行插入操作的线性表
1)存储结构:
①顺序存储对应一组操作:顺序队列、循环队列
循环队列的相关考点
a、大小为 6 的数组来实现循环队列,且当前 rear 和 front 的值分 别为 0 和 3,当从队列中删除
一个元素,再加入两个元素后,rear 和 front 的值分别为4和2
b、front 为队头指针,rear 为队尾指针,其中front 指向队头元素,rear指向队尾元素的下一个位
置,m为最大空间。出队操作为 front=(front+1)%(m+1)
c、若顺序存储的循环队列的 QueueMaxSize=n,则该队列最多可存储 (n-1 )个元素。
②链式存储对应一组操作:链队列
链式队列的相关考点
a、用链接方式存储的队列,在进行插入运算时,头、尾指针可能都要修改
b、用循环链表表示队列,设队列的长度为 n,若只设尾指针,则出队和入 队的时间复杂度分别为. O(1),O(1)
c、 front 表示链式队列的队头指针, rear 表示链式队 列的队尾指针,指针变量 s 指向将要入队
列的结点 X,则入队列的操作序列为rear->next=s;rear=s
2)特性:先进先出
4、栈与队列特性
2、栈:
栈的计算(考点):
1、进栈出栈顺序问题
给出一定元素的进栈顺序,求这些元素不可能出栈的顺序情况。
2、求栈至少多少的容量问题
给出一定元素的进栈顺序和出栈顺序,求至少需要多大的容量可以进行此操作。
3、求栈中元素
给出栈中bottom的位置和top的位置,求栈中的元素
如果bottom = 0,则元素个数为|top-bottom|。
注意:如果top中也存放元素,则元素个数为|top-bottom+1|
注意:在栈中bottom一端是被固定的。
4、栈中指针的位置
栈空时指针的具体位置:
top == 0,让元素进入当前的栈,然后是再移动top指针;这时,top指针一直在现存元素栈顶的上一个位置。
top == -1,先移动top指针,然后让元素进入当前的栈;这时,top指针永远指向当前元素的位置。
各情况的指针的具体位置:
注意此时定义的栈空的情形:
top == 0
出栈:top -- ,读取元素
满栈:top = 栈容量-1
进栈:进入元素,top++
3、队列:
链队列——链式存储对应一组操作,且空间不必连续
两个指针:
队头指针Q.front指向头结点
队尾指针Q.rear指向尾结点
初始态:
队空条件:
头指针和尾指针均指向头结点
Q.front = Q.rear
循环队列——顺序存储对应的操作,且空间连续
两个指针:
Q.front指向队列头元素
Q.rear指向队列尾元素的下一个位置
具体情况的相关判断:
初始态:
Q.front = Q.rear = 0
队空条件:
Q.front == Q.rear
队满条件:
Q.rear + 1)% MAX == Q.front
入队情况:
Q.rear = (Q.rear + 1)% MAX
出队情况:
Q.front = (Q.front + 1)% MAX
求队列中实际元素的个数:
Q.rear - Q.front + MAX )% MAX
5、 栈和队列的应用
1)将一个递归算法改为对应的非递归算法时,通常需要使用 栈
2)算术表达式 A+B*C-D/E 转为前缀表达式后为 -+A*BC/DE
3)中缀表达式 A*(B+C)/(D-E+F)的后缀表达式是 ABCDEF*+/-+