一、单选
1. 栈和队列具有相同的( )。
A. 抽象数据类型
B. 逻辑结构
C. 存储结构
D. 运算
[Solution]
栈和队列具有相同的逻辑结构,即线性逻辑结构,
$therefore B$✔️.
8. 向一个栈顶指针为top的链栈中插入一个x结点,则执行( )。
A. top->next=top;
B. x->next=top->next;top->next=x;
C. x->next=top;top=x;
D. x->next=top;top=top->next;
[Solution]
链栈采用不带头结点的单链表表示时,进栈操作在首部插入一个结点x(x->next=top;),再将top指向该插入的结点(top=x;)
Push时,先让top与新结点联系上,再进行插入。如顺序栈的Push:top先+1,后插入;链栈的Push:x->next = top; top = x;
$therefore B$✔️.
9. 链栈执行Pop操作,并将出栈的元素存在x中应该执行( )。
A. x=top;top=top->next
B. x=top->data;
C. top=top->next;x=top->data;
D. x=top->data;top=top->next;
[Analysis]
出栈时,应该元素先出栈,top再-1。即x=top->data;top=top->next;
$therefore D$✔️.
11. 3个不同元素进栈,能得到( )种不同的出栈序列。
A. 4
B. 5
C. 6
D. 7
[Analysis]
出栈序列的个数=卡特兰(Catalan)数=
组合数=
$therefore B$✔️.
19. 一个栈的输入序列是1,2,3…,n,输出序列的第一个元素是i,则第j个输出元素是( )。
A. i-j+1
B. i-j
C. j-i+1
D. 不确定
[Analysis]
j都不知道是个啥,咋子确定嘛。
$therefore D$✔️.
23.[2013] 一个栈的入栈序列为1,2,3,…,n,其出栈序列为$p_1$,$p_2$,$p_3$,…,$p_n$。若$p_2=3$,则$p_3$可能取指的个数是( )。
A. n-3
B. n-2
C. n-1
D. 无法确定
[Analysis]
(1) $p_3$为3之后的数,即4,5,…,n都是可能取的数;
(2) $p_3$为3之前的数,即1或2:当$p_3$为2时,$p_1$为1,很合理;当$p_3$为1时,$p_1$就应该为2(2先出去了)。
故$p_3$可去除了3以外的所有数,即n-1个。
$therefore C$✔️.
24. 设栈的初始状态为空,当字符序列“n 1 _”作为栈的输入时,输出长度为3,且可用作C语言标识符的序列有( )个。
A. 4
B. 5
C. 3
D. 6
[Analysis]
n 1不能出现。可以出现的序列有:_n1,_1n,n1
$therefore C$✔️.
二、综合应用题
4. 设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型。试着设计算法判断该链表的全部n个字符是否中心对称,例如xyx,xyyx,都是中心对称。
1 | int (LinkList L, int n){ |
5. 设有两个栈s1和s2都采用顺序栈方式,并且共享一个存储区[0…maxsize-1]。为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的存储方式。试着设计s1和s2有关入栈和出栈的操作算法。
1 |
|