3.1.48.向一个栈顶指针为top的链栈(不带头结点)中插入一个x结点,则执行( )
A top->next=x; B x->next=top->next; top->next=x;
C x->next=top; top=x; D x=top->data; top=top->next;
————————分割线————————
题目分析:注意一个点(不带头结点)。典型头插法,让新结点的指针域指向栈顶指针,再让栈顶指针top改为新结点x,这样新结点x就被插入到链栈中。
正确答案:C
3.1.417. 若一个栈的输入序列是1,2,3,…,n,输出序列的第一个元素为n,则第i个输出元素时( )
A 不确定 B n-i C n-i-1 D n-i+1
————————分割线————————
题目分析:这题很明显,第一个输出元素时n,意味着输出的序列与输入的序列刚好相反,第二个输出的元素为n-2+1= n-1,根据归纳法得出,选D。
正确答案:D
3.1.418. 若一个栈的输入序列是1,2,3,…,n,输出序列的第一个元素为i,则第j个输出元素时( )
A i-j-1 B i-j C j-i+1 D 不确定
————————分割线————————
题目分析:这题与上一天有明显的区别。第一个输出的为i,第二个输出可能是i-1,(i+1)-n这样一个集合,所以无法确定第j个输出的元素时什么。
正确答案:D
3.1.420. 若一个栈的输入序列为P1,P2,…,Pn,输出序列为1,2,3,…,n,若P3=1,则P1的值为( )
A 可能是2 B 一定是2 C 不可能是2 D 不可能是3
————————分割线————————
题目分析:如果P3为1,那么下一个输出2的可能是P2,P4-Pn,不可能是P1,故P1不能为2.
正确答案:C
3.1.421. 若已知一个栈的入栈序列是1,2,3,4,其出栈序列为P1,P2,P3,P4,则P2,P4不能是( )
A 2,4 B 2,1 C 4,3 D 3,4
————————分割线————————
题目分析:
第一种办法,暴力破解,把所有的序列都列出来一一比对,不推荐,耗时太多。
第二种办法,假设值法,
关于AB选项,P2为2时,P4可以为1、4均不冲突,有1234和3241两种情况。
关于C选项,由于4是最后一个入栈的元素,所以在出4之前栈底还有两个元素就是23,且出栈顺序只能是32无法调整,就有出栈序列1432,故C错误。
关于D选项,有两种情况,P1=1,有序列1324,P1=2,有序列2314均满足条件。
正确答案:C
3.1.422.[2013真题]一个栈的入栈序列为1,2,3,…,n,其出栈序列为P1,P2,P3,…,Pn,若P2=3,则P3可能取值的个数是( )
A n-3 B n-2 C n-1 D 不确定
————————分割线————————
题目分析:3之后的数字显然都是可取的(刚入栈就出栈)
考虑1,2的情况。若P3=1,则有231...出栈方法。若P3=2,则有132出栈方法,所以P3只有3不能取,故有n-1种取法。
正确答案:C
3.1.424.[2011真题]元素a,b,c,d,e依次进入初始为空的栈中,若元素进栈后可停留,可出栈,直到所有元素都出栈,则在所有可能的出栈序列中,
以元素d开头的序列个数为( )
A 3 B 4 C 5 D 6
————————分割线————————
题目分析:decba,dceba,dcbea,dcbae直接列出即可
正确答案:B
数据结构—队列
思维导图
强化练习
3.2.56. 已知循环队列的存储空间为数组A[21],front指向队头元素的前一个位置,rear指向队尾元素,假设当前front和rear的值分别为8和3,则该队列
的长度为( )
A 5 B 6 C 16 D 17
————————分割线————————
题目分析:长度=(rear-front+MaxSize)%MaxSize=16
正确答案:C
3.2.58.[2011真题]已知循环队列存储在一位数组A[0...n-1]中,且队列非空时front和rear分别指向队头元素和队尾元素。若初始时队列为空,且要求第一
个进入队列的元素存储在A[0]处,则初始时front和rear的值分别为( )。
A 0,0 B 0,n-1 C n-1,0 D n-1,n-1
————————分割线————————
题目分析:倒推逻辑,假设有一个元素,那么rear和front都指向0,实际上这一个元素进来之前,只有尾指针rear改变了,所以倒推出rear的初始位置是n-1。
正确答案:B
3.2.510.[2014真题]循环队列放在一位数组A[0...M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作。
队列中最多能容纳M-1个元素。初始时为空,下列判断队空和队满的条件中,正确的是( )
A 队空:end1==end2; 队满:end1==(end2+1)modM
B 队空:end1==end2; 队满:end2==(end1+1)mod(M-1)
C 队空:end2==(end1+1)modM; 队满:end1==(end2+1)modM
D 队空:end1==(end2+1)modM; 队满:end1==(end2+1)mod(M-1)
————————分割线————————
题目分析:通过特殊情况来判别队空队满的条件。
队空判断,假设队中有只一个元素,在位置1,那么队头指针指向1,队尾指针指向2。此时执行出队操作,队头指针+1=2= 队尾指针,此时队空。
故队空条件是 end1==end2。
队满判断,队中能容纳M-1个元素,假设一个满队列元素,队头在0位置,队尾在M-2位置,此时队满。end1为0,end2为队尾元素后一个即M-1,判断队满条件为
end1==(end2+1)modM。
正确答案:A
3.2.518.[2010真题]某队列允许在其两端进行入队操作,但仅允许在一段进行出队操作。若元素a,b,c,d,e一次入此队列后再进行出队操作,则不可能得到
的出队序列为( )
A bacde B dbace C dbcae D ecbad
————————分割线————————
题目分析:
第一种方法,每一个都过一遍。
第二种方法,换个思路,就是通过两侧入队,组合好整个串,然后一齐输出。显然bdcae无法组成,原因是,c在b后入队,仅能在c的左侧构成cda或者在a右侧构成dac的结构,故选C。
正确答案:C
3.2.519.[2018真题]现有队列Q与栈S,初始时Q中的元素一次是1,2,3,4,5,6(1在队头),初始S为空,若仅允许下列3中操作:1.出队并输出出队元素
2. 出队并将出队元素入栈 3. 出栈并输出出栈元素,则不能得到的输出序列为( )
A 125643 B 234561 C 345612 D 654321
————————分割线————————
题目分析:考察栈和队列的理解。A中1256可以直接输出,34可以压栈输出没问题。B中1可以压栈,23456直接输出没问题。C中3456可以直接输出,但是12的入栈
顺序错误,如果为21则可以。D中全部压栈再输出。
正确答案:C