D.队空: end1== (end2+1) mod M; 队满: end2== (end1+1) mod (M-1)
分析:end1 指向队头元素,可知出队操作是先从 A[end1]读数,然后 end1 再加 1。end2 指
向队尾元素的后一个位置,可知入队操作是先存数到 A[end2],然后 end2 再加 1。若用 A[0]
存储第一个元素,队列初始时,入队操作是先把数据放到 A[0]中,然后 end2 自增,即可知
end2 初值为 0;而 end1 指向的是队头元素,队头元素在数组 A 中的下标为 0,所以得知 end1
的初值也为 0,可知队空条件为 end1==end2;然后考虑队列满时,因为队列最多能容纳 M-
1 个元素,假设队列存储在下标为 0 到 M-2 的 M-1 个区域,队头为 A[0],队尾为 A[M-2],此
时队列满,考虑在这种情况下 end1 和 end2 的状态,end1 指向队头元素,可知 end1=0,
end2 指向队尾元素的后一个位置,可知 end2=M-2+1=M-1,所以可知队满的条件为 end1==
(end2+1)mod M,故选 A。
(三)栈和队列的链式存储结构
1.设链表不带头结点且所有操作均在表头进行,则下列最不适合作为链栈的是( )。
A.只有表头结点指针,没有表尾指针的双向循环链表
B.只有表尾结点指针,没有表头指针的双向循环链表
C.只有表头结点指针,没有表尾指针的单向循环链表
D.只有表尾结点指针,没有表头指针的单向循环链表
分析:对于双向循环链表,不管是表头指针还是表尾指针,都可以很方便地找到表头结点,
方便在表头做插入或删除操作。而单循环链表通过尾指针可以很方便地找到表头结点,但通
过头指针找尾结点则需要遍历一次链表。对于 C,插入和删除结点后,找尾结点需要花费 O(n)
的时间。故选 C
2.向一个栈顶指针为 top 的链栈中插入一个 x 结点,则执行( )。
A. top->next=x
B. x->next=top->next;top->next=x
C. x->next=top;top=x
D. x->next=top;top=top->next
分析:链栈采用不带头结点的单链表表示时,进栈操作在首部插入一个结 x(即 x->next=top),
插入完后需将 top 指向该插入的结点 x。请思考当链栈存在头结点时的情况。故选 C
3.最适合用做链队的链表是( )。
A.带队首指针和队尾指针的循环单链表
B.带队首指针和队尾指针的非循环单链表
C.只带队首指针的非循环单链表
D.只带队首指针的循环单链表
分析:由于队列需在双端进行操作,选项 C 和 D 的链表显然不太适合链队。选项 A 的链表
在完成进队和出队后还要修改为循环的,对于队列来讲这是多余的(画蛇添足)。对于选项 B,
由于有首指针,适合删除首结点;由于有尾指针,适合在其后插入结点,故选 B。
4.最不适合用做链式队列的链表是( )。
A.只带队首指针的非循环双链表
B.只带队首指针的循环双链表