循环队列中,每删除一个元素,队首指针front=(front+1)%6,每插入一个元素,队尾指针rear=(rear+1)%6。上述操作后,front=0,rear=3。
插入操作时,先将结点x插入到链表尾部,再让rear指向这个结点x。C的做法不够严密,因为是队尾,所以队尾x->next必须置为空。
使用排除法。先看可由输入受限的双端队列产生的序列:设右端输入受限,1,2,3,4依次左入,则依次左出可得4,3,2,1,排除A;右出、左出、右出、右出可得到4,1,3,2,排除B;再看可由输出受限的双端队列产生的序列:设右端输出受限,1,2,3,4依次左入、左入、右入、左入,依次左出可得到4,2,1,3,排除D。
根据题意,第一个元素进入队列后存储在A[0]处,此时front和rear值都为0。入队时由于要执行(rear+1)%n操作,所以若入队后指针指向0,则rear初值为n-1,而由于第一个元素在A[0]中,插入操作只改变rear指针,所以front为0不变。
end1==end2; 队满:end1==(end2+1) mod Mend1==end2; 队满:end2==(end1+1) mod (M-1)end2==(end1+1) mod M; 队满:end1==(end2+1) mod Mend1==(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。
图的广度优先搜索类似于树的层序遍历,都要借助于队列。
nextval从0开始,可知串的位序从1开始。第一步,令nextval[1]=next[1]=0。
| 编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| S | a | b | a | b | a | a | a | b | a | b | a | a |
| next | 0 | 1 | 1 | 2 | 3 | 4 | 2 | 2 | 3 | 4 | 5 | 6 |
| nextval | 0 | 1 | 0 | 1 | 0 | 4 | 2 | 1 | 0 | 1 | 0 | 4 |
从j=2开始,依次判断 P j P_j Pj是否等于 P n e x t [ j ] P_{next[j]} Pnext[j]?若是则将next[j]修正为next[next[j]],直至两者不相等为止。
设树中度为i(i=0,1,2,3,4)的结点数分别为 n i n_i ni,树中结点总数为n,则n=分支数+1,而分支数又等于树中各结点的度之和,即n=1+ n 1 n_1 n1+2 n 2 n_2 n2+3 n 3 n_3 n3+4 n 4 n_4 n4= n 0 n_0 n0+ n 1 n_1 n1+ n 2 n_2 n2+ n 3 n_3 n3+ n 4 n_4 n4。依题意, n 1 n_1 n1+2 n 2 n_2 n2+3 n 3 n_3 n3+4 n 4 n_4 n4=10+2+30+80=122, n 1 n_1 n1+ n 2 n_2 n2+ n 3 n_3 n3+ n 4 n_4 n4=10+1+10+20=41,可得出 n 0 n_0 n0=82,即树T的叶结点的个数是82。
