1.给定一个堆栈的入栈序列为{ 1, 2, ⋯, n },出栈序列为{ p1, p2, ⋯, pn }。如果p2=n,则存在多少种不同的出栈序列?(C)
A.1
B.2
C.n−1
D.n
2.从栈顶指针为ST
的链栈中删除一个结点且用X
保存被删结点的值,则执行:(C)
A.X= ST->data;
B.X= ST; ST = ST->next;
C.X= ST->data; ST = ST->next;
D.ST = ST->next; X= ST->data;
解析:考查链栈结构。
3.
将5个字母ooops
按此顺序入栈,则有多少种不同的出栈顺序可以仍然得到ooops
?(C)
A.1
B.3
C.5
D.6
解析:
4.已知程序如下:
int s(int n) { return (n<=0) ? 0 : s(n-1) +n; }
void main() { cout<< s(1); }
程序运行时使用栈来保存调用过程的信息,自栈底到栈顶保存的信息一次对应的是(A ) 。
A.main()->S(1)->S(0)
B.S(0)->S(1)->main()
C.main()->S(0)->S(1)
D.S(1)->S(0)->main()
5.下列关于栈的叙述中,错误的是:
- 采用非递归方式重写递归程序时必须使用栈
- 函数调用时,系统要用栈保存必要的信息
- 只要确定了入栈次序,即可确定出栈次序
- 栈是一种受限的线性表,允许在其两端进行操作
A.仅 1
B.仅 1、2、3
C.仅 1、3、4
D.仅 2、3、4
解析:注意1是不正确的。
6.表达式a*(b+c)-d
的后缀表达式是:(A)
A.a b c + * d -
B.a b c d * + -
C.a b c * + d -
D.- + * a b c d
解析:小题可以逐个选项检查。
(具体利用栈求解表达式和转换表达式的过程见栈课件)
(也可以利用树来做,具见树课件)
7.
所谓“循环队列”是指用单向循环链表或者循环数组表示的队列。(F)
解析:循环队列是一个抽象的数据结构,而单向循环链表和循环数组都是具体的实现方法并不是数据结构的本身。
8.在一个链队列中,front和rear分别为头指针和尾指针,则插入一个结点s的操作为( C)。
A.front=front->next
B.s->next=rear;rear=s
C.rear->next=s;rear=s;
D.s->next=front;front=s;
解析:考查链队列的结构。
9.如果循环队列用大小为m
的数组表示,且用队头指针front
和队列元素个数size
代替一般循环队列中的front
和rear
指针来表示队列的范围,那么这样的循环队列可以容纳的元素个数最多为:(B)
A.m-1
B.m
C.m+1
D.不能确定
10.令P代表入栈,O代表出栈。若利用堆栈将中缀表达式3*2+8/4
转为后缀表达式,则相应的堆栈操作序列是:(C)
A.PPPOOO
B.POPOPO
C.POPPOO
D.PPOOPO
解析:
注意:题目中显示的只有操作符的序列。
11.如果循环队列用大小为m
的数组表示,队头位置为front
、队列元素个数为size
,那么队尾元素位置rear
为:(D)
A.front+size
B.front+size-1
C.(front+size)%m
D.(front+size-1)%m