第3章栈和队列讲解
《数据结构》
第3章栈和队列
共85题
一、单选
1. (1)分题目ID号:10705 题目难度:容易
设对一组数据的处理具有“后进先出”的特点,则应采用的数据结构是【1】
A. 队列
B. 栈
C. 顺序表
D. 二叉树题目答案:B
2. (1)分题目ID号:10706 题目难度:容易
若进栈序列为3、5、7、9,进栈和出栈可穿插进行,则不可能的出栈序列是【1】
A. 7,5,3,9
B. 9,5,7,3
C. 9,7,5,3
D. 7,5,9,3
题目答案:B
3. (1)分题目ID号:10707 题目难度:较难
设用一维数组A[m]存储栈,令A[m-1]为栈底,t指示当前栈顶的位置。如果栈不空,则出栈时应使【1】
A. t=t+l
B. t=t-1
C. t=m-1
D. 不改变t
题目答案:A
4. (1)分题目ID号:10708 题目难度:容易
设用一维数组A[m]存储栈,令A[0]为栈底,top指示当前钱顶的位置,当把栈清空时所要执行的操作是【1】
A. top--
B. top=0
C. top=-1
D. top=m-1 题目答案:C
5. (1)分题目ID号:10709 题目难度:容易
设栈s的初始状态为空,如果进栈序列为1、2、3、4、5、6,出栈序列为3、2、5、6、4、1,则s的容量至少是【1】
A. 6
B. 4
C. 2
D. 3
题目答案:D
6. (1)分题目ID号:10710 题目难度:容易
设栈s最多能容纳4个元素,现有A、B、C、D、E、F六个元素按顺序进栈,以下可能的出栈序列是【1】
A. E、D、C、B、A、F
B. B、C、E、F、A、D
C. C、B、E、D、A、F
D. A、D、F、E、B、C
题目答案:C
7. (1)分题目ID号:10711 题目难度:容易
链式栈与顺序栈相比,一个比较明显的优点是【1】
A. 插入操作更加方便
B. 通常不会出现栈满的情况
C. 不会出现栈空的情况
D. 删除操作更加方便题目答案:B
8. (1)分题目ID号:10712 题目难度:容易
在完成出栈操作时,【1】
A. 必须判断栈是否满
B. 要判断栈元素的类型
C. 必须判断栈是否空
D. 不必做任何判断
题目答案:C
9. (1)分题目ID号:10713 题目难度:容易
已知栈的入栈序列是1、2、3、……、n,出栈序列是e1、e2、……、en。若e1=n,则ei为【1】
A. i
B. n-i+1
C. n-i
D. 不能确定
题目答案:B
10. (1)分题目ID号:10714 题目难度:容易
在解决计算机主机与打印机之间速度不匹配问题时,通常设置一个打印数据缓冲区,
主机将要输出的数据依次写入该缓冲区,打印机则从该缓冲区取出数据打印,该缓冲区应该是一个【1】结构。
A. 栈
B. 队列
C. 线性
表 D. 数组
题目答案:B
11. (1)分题目ID号:10715 题目难度:容易
【1】不是队的基本运算。
A. 向队尾插入一个元素
B. 读队头元素
C. 删除队中第i个元素
D. 判队是否为空
题目答案:C
12. (1)分题目ID号:10716 题目难度:容易
当以顺序方式存储队列时,解决“假溢出”较为有效的方法是采用【1】
A. 顺序队列
B. 链式队列
C. 顺序循环队列
D. 三种都可以
题目答案:C
13. (1)分题目ID号:10717 题目难度:容易
设一维数组Q[m]用于存放循环队列中的元素,同时用f指示当前队头
元素的位置,r指示当前队尾元素的下一个位置。假定队中元素个数总小于m,则计算队列中元素个数的公式为【1】
A. (m+r-f)%
m B. r-f C. m-(f-r) D. (m+(f-r))%m 题目答案:A
题目分析:循环队列是解决假溢出的问题,通常把一维数组看成首尾相接。在循环意义下的求元素个数的运算可以利用求模运算。
14. (1)分题目ID号:10718 题目难度:容易
若用一个大小为10的一维数组存储顺序循环队列,且当前rear和front的值分别为4
和8,当从队列中删除3个元素再加入2个元素后,rear和front的值分别是【1】
A. 无法完成要求的操作
B. 6和l
C. 7和
0 D. 6和11
题目答案:B
题目分析:循环队列是解决假溢出的问题,通常把一维数组看成首尾相接。在循环意义下的加1运算通常用求模运算来实现。所以入队和出队时的操作分别为:rear=(rear+1)%m,front=(front+1)%m。
15. (1)分题目ID号:10719 题目难度:容易
栈和队列都是运算受限的线性表,它们的共同点是【1】
A. 只允许在端点处插入和删除元素
B. 元素都是后进先出
C. 元素都是先进先
出 D. 必须采用顺序存储结构
题目答案:A
题目分析:栈和队列都是运算受限的线性表,只允许在表端点处进行操作。16. (1)分题目ID号:11091 题目难度:容易
在一个链式队列中,假设front和rear分别为队头和队尾指针,则插入s所指结点的操
作为【1】
A. rear->next=s;rear=s;
B. front ->next=s;front=s;
C. s->next=front;front=s;
D. s->next=r ear;rear=s;
题目答案:A
题目分析:队列是运算受限的线性表(FIFO),插入元素只能插在队尾,所以需修改队尾指针。
17. (1)分题目ID号:11096 题目难度:容易
用链接方式存储的队列,在进行删除运算时【1】
A. 仅修改头指针
B. 头、尾指针可能都要修改
C. 头、尾指针都要修改
D. 仅修改尾指针
题目答案:B
题目分析:若队列中的元素多于一个,删除队列中的队尾元素,只需修改队尾指针;若队列中只有一个元素,删除该元素后,队头队尾指针都需要修改。
18. (1)分题目ID号:11097 题目难度:容易
设计一个判别表达式中左,右括号是否配对出现的算法,采用【1】数据结构最佳。
A. 线性表的顺序存储结构
B. 队列
C. 线性表的链式存储结构
D. 栈
题目答案:D
19. (1)分题目ID号:11099 题目难度:容易
表达式a*(b+c)-d的后缀表达式是【1】
A. abcd*+-
B. abc+*d-
C. abc*+d-
D. -+*abcd
题目答案:B
20. (1)分题目ID号:11228 题目难度:容易
已知队列(4,41,5,7,18.26,15),第一个进入队列的元素是4,则第五个出队列的元素是【1】
A. 5
B. 41
C. 18
D. 7
题目答案:C
21. (1)分题目ID号:11229 题目难度:容易
对于顺序存储的循环队列,存储空间大小为N,头指针为F,尾指针为R,队列中元素
的个数应为【1】
A. R-F
B. N+R-F
C. (R—F十1)%
N D. (N+R-F)%N
题目答案:D
22. (1)分题目ID号:11230 题目难度:容易
一个队列的进队列顺序是1,2,3,4,则出队列顺序为【1】
A. 4,3,2,1
B. 2,4,3,1
C. 1,2,3,4
D. 3,2,1,4
题目答案:C
23. (1)分题目ID号:11231 题目难度:容易
下列关于栈的叙述中正确的是【1】
A. 在栈中只能插入数据
B. 在栈中只能删除数据
C. 栈是先进先出的线性表
D. 栈是先进后出的线性表
题目答案:D
24. (1)分题目ID号:11232 题目难度:容易
设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1,则栈S的容量至少应该是【1】
A. 6
B. 4
C. 3
D. 2
题目答案:C
题目分析:根据栈的性质(LIFO)得,e2出栈前,栈中存有e1和e2两个元素,e4出栈前,栈中存有e1、e3和e4三个元素,e4和e3出栈以后,e5和e6入栈,栈中同样存在e1、e5和e6三个元素,然后三个元素依次出栈,所以栈的容量至
少应该为3。
25. (1)分题目ID号:11651 题目难度:容易
若一个栈以向量V[1..n]存储,初始栈顶指针top为n+1,则下面x进栈的正确操作是【1】
A. top=top+1; V[top]=x
B. V[top ]=x; top=top+1
C. top=top-1; V[top]=x
D. V[top ]=x; top=top-1
题目答案:C
题目分析:栈式运算受限的线性表,只允许在栈顶进行插入和删除操作。本题中栈顶指针为n+1,该数组将栈顶放在了下标大的一端,所以在进行入栈操作时top 指针应该进行减一操作。通常元素进栈的操作为:先移动栈顶指针后存入元素。
26. (1)分题目ID号:11652 题目难度:容易
一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i (1≤i≤n)个元素是【1】
A. 不确
定 B. n-i+1 C. i
D. n-i
题目答案:B
题目分析:
【解析】根据栈的性质(LIFO),若输出的第一个元素是n,则表明所有的元素已经入栈,则出栈顺序为n,n-1,…,3,2,1。
27. (1)分题目ID号:11653 题目难度:容易
如果我们用数组A[1..100]来实现一个大小为100的栈,并且用变量top 来指示栈顶,top的初值为0,表示栈空。请问在top为100时,再进行入栈操作,会产生【1】
A. 正常动作
B. 溢出
C. 下
溢 D. 同步
题目答案:B
题目分析:当top为100时,表示栈已经满了,此时再进行入栈操作,则会造成溢出。
28. (1)分题目ID号:11654 题目难度:容易
栈在【1】中应用。
A. 递归调用
B. 子程序调
用 C. 表达式求值 D. A,B,C
题目答案:D
29. (1)分题目ID号:11655 题目难度:容易
若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front
的值分别为多少?【1】
A. 1和 5
B. 2和
4 C. 4和2 D. 5和1
题目答案:B
题目分析:循环队列是解决假溢出的问题,通常把一维数组看成首尾相接。在循
环意义下的加1运算通常用求模运算来实现。所以入队和出队时的操作分别为:rear=(rear+1)%m,front=(front+1)%m。
30. (1)分题目ID号:11656 题目难度:容易
栈和队列的共同点是【1】
A. 都是先进先
出 B. 都是先进后出
C. 只允许在端点处插入和删除元素
D. 没有共同点
题目答案:C
题目分析:栈和队列都是运算受限的线性表,只允许在表端点处进行操作。31. (1)分题目ID号:11657 题目难度:容易
判定一个栈S(元素个数最多为MAXSIZE)为空和满的条件分别为【1】
A. S->top!=-1 S->top!=MAXSIZE-1
B. S->top=-1 S->top=MAXSIZE-1
C. S->top=-1 S->top!=MAXSIZE-1
D. S->top!=-1 S->top=MAXSIZE-1
题目答案:B
二、多选
1. (1)分题目ID号:11227 题目难度:容易
已知元素(8,25,14,87,51,90,6,19,20)。这些元素以怎样的顺序进入栈;才能使出栈的顺序满足:8在51前面;90在87后面;20在14后面;25在6前面;19在90后面【1】
A. 20,6,8,51,90,25,14,19,87
B. 51,6,19,20,14,8,87,90 ,25
C. 19,20,90,8,6,25,51,14,87
D. 6,25,51,8,20,19,90,87 ,14
题目答案:BCD
三、是非
1. (1)分题目ID号:11233 题目难度:容易
【1】栈和队列逻辑上都是线性表。
题目答案:T
2. (1)分题目ID号:11234 题目难度:容易
【1】采用循环链表作为存储结构的队列就是循环队列。
题目答案:F
3. (1)分题目ID号:11235 题目难度:容易
【1】栈和队列都是顺序存取的线性表,但它们对存取位置的限制不同。题目答案:T
4. (1)分题目ID号:11236 题目难度:容易
【1】在栈中只能插入数据。
题目答案:F
5. (1)分题目ID号:11237 题目难度:容易
【1】在栈满情况下不能做进栈运算,否则产生“上溢”。
题目答案:T
6. (1)分题目ID号:11238 题目难度:容易
【1】判定一个队列q(最多元素为m)为空的条件是(q一>rear十1)%m=q一>front.
题目答案:F
四、填空
1. (3)分题目ID号:10746 题目难度:容易
一个理发店有两名理发师,一名理发师专为年纪最大的顾客服务,另一名理发师为进入理发店时间最长的顾客服务,进入理发店的顾客根据到达的时间先后顺序都排人一个队列。假设用程序来模拟理发店顾客队列的变化情况,该顾客队列在逻辑上可视为哪种数据结构?【1】要存储相关信息应采用哪一种存储结构?【2】为什么?【3】
题目答案:线性表】链式存储结构】因为顾客出队没有限定在一端;新来的顾客要加入队列,接受理发师服务的顾客要离开队列,对顾客队列这个线性表来说,需要经常的插入和删除操作。】
2. (2)分题目ID号:10782 题目难度:容易
在以顺序方式存储队列时,会出现“假溢出”现象,请解释这一现象【1】,并说明解决“假溢出”的方法及其原理。【2】
题目答案:“假溢出”是指存储队列的空间中还有空余,但不能进行入队操作,它是由队列的操作方式决定的。】解决“假溢出”的方法有:①建立一个足够大的存储空间,但这样会造成空间的浪费。②采用循环队列方式。把存储队列的一维空间看成是一个首尾相接的圆环,这样就可以实现对由于元素出队而空出来的空间的循环使用。③采用平移元素的方法。每当出现“假溢出”时,将队列中所有元素平移,使当前队头元素位于数组的最前端,并修改队头和队尾指示器。此方法效率很低。】
3. (5)分题目ID号:10785 题目难度:较难
有n个人排成一排,每个人的编号为i(0≤i≤n),现让这n个人从左到右1、2、l、2、
……报数,凡报“1”的人出列,报“2”的人立即站到队的最右端,此过程反复进行,直到n个人都已出列。设已知n个人原来在队列中的顺序,以下程序可求出他们出列的顺序。例如,设n=6,韧始顺序为1、2、3、4、5、6,则出列顺序为1、3、5、2、6、4。
算法说明:此问题可利用队列结构处理。设一维数组P[n]存放循环队列,f和r分别为队列的队头和队尾指示器,首先让n个人的初始序号依次入队,然后反复执行以下操作,直到队列为空。
①输出队头元素,并删除之:
②若刚刚离队的元素值在当时的队列中最大,则记录下当前队列中最大元素值,否则将队头元素插入到队尾。
程序如下:
#include using std::cout; using std::endl; const int N=20; int main( ){ int p[N]; int f=0,r=0,qm=N; for(int i=1;i<=N;i十十){ p[ 【1】]=i; r=(r十1)%N; } do{ int t=p[f]; cout< f=【2】; if(t==qm)qm--; else{ 【3】=p[f]; r=【4】; f=【5】; } }while(f!=r); cout< return 0; } 题目答案:r】(f+1)%N 】p[r]】(r+1)%N】(f+1)%N】 4. (5)分题目ID号:10791 题目难度:较难 以下函数用于检验一个表达式中括号是否匹配。如果匹配返回1,否则返回0。设表达式中只使用了括号( )和方括号[ ],表达式在一维数组exp[]中。 算法说明:为检查表达式中括号的匹配情况,可设置一个栈s。从左到右扫描表达式,若当前字符为左括号,则将其压入栈s中。若当前字符为右括号,则检查它是否与栈顶的左括号相匹配。若相匹配,则删去这一对括号;不相匹配,则表示表达式中括号不匹配。若扫描完表达式时栈为空,则说明表达式中括号是匹配的,否则是不匹配的。函数中使用变量flag作为括号匹配的标志,flag为1表示匹配,flag为0表示不匹配。 程序如下: const int MaxSize=100; int matching(char exp[MaxSize]){ char s[MaxSize]; int top=-1; //s作为顺序栈,top为栈顶指示器 int flag,i; flag=1;i=0; while(exp[i]&&flag){ switch(exp[i]){ case'(': case'[': 【1】=exp[i];break; case')': if(【2】)top--; else flag=0; break; case']': if(【3】)top--; else flag=0; break; } 【4】 } if(【5】)return 1; else return 0; } 题目答案:s[++top]】top!=-1&&s[top]=='('】top!=-1&&s[top]=='['】i++】flag&&top==-1】 5. (3)分题目ID号:10796 题目难度:较难 编写一个函数,利用队列和栈的基本运算将指定队列中的元素进行逆转。 算法说明:利用一个临时栈tempst,将指定队列que中所有元素出队并入栈到tempst,然后再将栈tempst中的所有元素出栈并入队到que,此时,队列que中的元素已发生逆转。在以下函数中使用了STL的容器适配器定义队列和栈。 程序如下: #include #include using namespace std; template void reverse_que(quedu T x; stack while( 【1】){ x=que.front(); / /取队头元素到x tempst.push(x); // x入栈 【2】; } while(!tempst.empty()){ //当栈不为空时 x=tempst.top(); //取栈顶元素到x 【3】; tempst.pop(); //出栈 } } 题目答案:!que.empty()】que.pop()】que.push(x)】 6. (1)分题目ID号:11104 题目难度:容易 循环队列的引入,目的是为了克服【1】 题目答案:假溢出时大量移动数据元素】 7. (1)分题目ID号:11105 题目难度:容易 顺序栈用data[1..n]存储数据,栈顶指针是top,则值为x的元素入栈的操作是【1】 题目答案:data[++top]=x;】 8. (1)分题目ID号:11110 题目难度:容易 栈的特点是【1】 题目答案:先进后出』FILO』LIFO】 9. (1)分题目ID号:11142 题目难度:容易 队列是限制插入只能在表的一端,而删除在表的另一端进行的线性表,其特点是【1】 题目答案:先进先出』FIFO】 10. (5)分题目ID号:11145 题目难度:容易 有n个人排成一排,每个人的编号为i(0≤i≤n),现让这n个人从左到右1、2、l、2、 ……报数,凡报“1”的人出列,报“2”的人立即站到队的最右端,此过程反复进行,直到n个人都已出列。设已知n个人原来在队列中的顺序,以下程序可求出他们出列的顺序。例如,设n=6,韧始顺序为1、2、3、4、5、6,则出列顺序为1、3、5、2、6、4。 算法说明:此问题可利用队列结构处理。设一维数组P[n]存放循环队列,f和r分别为队列的队头和队尾指示器,首先让n个人的初始序号依次入队,然后反复执行以下操作,直到队列为空。 ①输出队头元素,并删除之: ②若刚刚离队的元素值在当时的队列中最大,则记录下当前队列中最大元素值,否则将队头元素插入到队尾。 程序如下: #include using std::cout; using std::endl; const int N=20; int main( ){ int p[N]; int f=0,r=0,qm=N; for(int i=1;i<=N;i十十){ p[ 【1】]=i; r=(r十1)%N; } do{ int t=p[f]; cout< f=【2】; if(t==qm)qm--; else{ 【3】=p[f]; r=【4】; f=【5】; } }while(f!=r); cout< return 0; 题目答案:r】(f+1)%N】p[r]】(r+1)%N 】(f+1)%N】 11. (3)分题目ID号:11146 题目难度:容易 以下函数的功能是,将一维整型数组A中所有奇数移到所有偶数之前。算法说明:可以设置两个下标变量i和j,它们的初值分别为0和n—1。从数组的两端开始,让i向右j向左对数组中元素进行扫描,若A[i]为偶数,A[j]为奇数,则交换A[i]和A[j]。当i和i重合时,算法结束。 程序如下: void oddbefore(int A[ ],int n){ int i,j,t; i=O;j=n一1; while(i while(A[i]%2==1&&【1】) //A[i]为奇数时,i 向右扫描 i++; while(A[j]%2==0&&【2】) //A[j]为偶数时,j 向左扫描 j--; if( 【3】){ t=A[i];A[i]=A[j];A[j]=t; i++;j--; } } } 题目答案:i < j】i < j】i < j】 12. (5)分题目ID号:11219 题目难度:容易 线性表、栈和队列都是【1】结构,可以在线性表的【2】位置插入和删除 元素,对于栈只能在【3】位置插人和删除元素,对于队列只能在【4】位置插人和【5】位置删除元素。 题目答案:线性】任意】栈顶】队尾】队头】 13. (2)分题目ID号:11220 题目难度:容易 对于顺序存储的栈,因为栈的空间是有限的,在进行【1】运算时,可能发生栈的上溢;在进行【2】运算时,可能发生栈的下溢。 题目答案:进栈』入栈】出栈】 14. (1)分题目ID号:11221 题目难度:容易 向栈中压入元素的操作是【1】。 题目答案:Push_stack】 15. (1)分题目ID号:11222 题目难度:容易 对栈进行退钱的操作是【1】 题目答案:Pop_Stack】 16. (2)分题目ID号:11223 题目难度:容易 在一个循环队列中,队首指针指向【1】,队尾指针指向【2】。 题目答案:队首元素】队尾元素的下一个位置】 17. (1)分题目ID号:11224 题目难度:容易 从循环队列中删除—个元素时,其操作是【1】。 题目答案:DeQueue】 18. (1)分题目ID号:11225 题目难度:容易 在栈顶指针为s的链栈中,判定栈空的条件是【1】 题目答案:s==NULL】 19. (3)分题目ID号:11226 题目难度:容易 栈和队列是两种特殊的线性表,栈的特点是【1】,队列的特点是【2】。二者共同特点是只能在它们的【3】处添加和删除结点。 题目答案:后进先出』LIFO』FILO】先进先出』FIFO】端点】 20. (2)分题目ID号:11658 题目难度:容易 栈是【1】的线性表,其运算遵循【2】的原则。 题目答案:操作受限』限定仅在表尾进行插入和删除操作】后进先出』LIFO』先进后出』FILO】 21. (2)分题目ID号:11659 题目难度:容易 设有一个空栈,栈顶指针为1000H(十六进制),现有输入序列为1,2,3,4,5,经过PUSH,PUSH,POP,PUSH,POP,PUSH,PUSH之后,输出序列是【1】,而栈顶指针值是【2】H。设栈为顺序栈,每个元素占4个字节。 题目答案:23】100CH】 题目分析:PUSH为入栈操作,POP为出栈操作。根据栈的性质,经过PUSH,PUSH,POP 运算之后,栈中存在元素1,输出数据为2,然后经过PUSH,POP,3入栈,3出栈,然后经过PUSH,PUSH之后4,5入栈,此时出栈序列为2,3,栈中元素为1,4,5;每个元素占4个字节,所以栈顶指针的值为1000H+3*4=100CH(十六进制数) 22. (3)分题目ID号:11660 题目难度:容易 已知链队列的头尾指针分别是f和r,则将值x入队的操作序列是【1】;【2】;【3】; 题目答案:newNode=new LinkNode(x)】newNode->link=r】r->link=newNode】题目分析:根据队列的性质,新插入的元素永远插在队尾。 23. (1)分题目ID号:11661 题目难度:容易 用下标0开始的N元数组实现循环队列时,为实现下标变量M加1后在数组有效下标范围内循环,可采用的表达式是:M=【1】。 题目答案:(M+1)%N】 题目分析:循环队列是解决假溢出的问题,通常把一维数组看成首尾相接。在循环意义下的加1运算通常用求模运算来实现。 24. (3)分题目ID号:11662 题目难度:容易 当两个栈共享一存储区时,栈利用一维数组stack[1..n]表示,两栈顶指针为top[1]与top[2],则当栈1空时,top[1]为【1】,栈2空时,top[2]为【2】,栈满时为【3】。 题目答案:0】n+1】top[1]+1=top[2]】 题目分析:为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的栈顶分别设在这片内存空间的两端,这样,当两个栈的栈顶在栈空间的某一位置相遇时,才产生上溢,即top[1]+1=top[2]。 25. (5)分题目ID号:11663 题目难度:容易 在作进栈运算时应先判别栈是否【1】;在作退栈运算时应先判别栈是否【2】;当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为【3】。 为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的空间时,应将两栈的【4】分别设在内存空间的两端,这样只有当【5】时才产生溢出。题目答案:满】空】n】栈底】两栈顶指针相邻】 26. (1)分题目ID号:11664 题目难度:容易 无论对于顺序存储还是链式存储的栈和队列来说,进行插入和删除运算的时间复杂度均相同为【1】。 题目答案:O(1)】 题目分析:对于栈用栈顶指针表示栈顶,而栈的插入和删除操作均在栈顶进行。对于队列用队头和队尾指针分别表示允许插入和删除的一端。 27. (1)分题目ID号:11665 题目难度:容易 在顺序队列中,当尾指针等于数组的上界,即使队列不满,再作入队操作也会产生溢出,这种现象称为【1】。 题目答案:假溢出】 题目分析:产生该现象的原因是,被删元素空间在该元素被删除后就永远得不到使用。为了克服这种现象,采用循环队列来实现。 28. (6)分题目ID号:11682 题目难度:容易 写出下列中缀表达式的后缀形式: 【1】 A * B * C 【2】- A + B - C + D 【3】A* - B + C 【4】(A + B) * D + E / (F + A * D) + C 【5】 A && B|| ! (E > F) {注:按C++的优先级) 【6】!(A && !( (B < C)||(C > D) ) )||(C < E) 题目答案:AB*C*】A-B+C-D+】AB-*C+】AB+D*EFAD*+/C+】AB&&EF>!||】 ABC 五、问答 1. (2)分题目ID号:10781 题目难度:容易 设栈S的初始状态为空,队列Q的初始状态为: 对栈S和队列Q进行以下操作: ①Q中元素依次出队,并压入栈S中,直至Q为空; ②依次弹出S中的元素并进入Q,直至S为空。 请画出在上述操作后队列Q的状态。 题目答案: 2. (3)分题目ID号:10783 题目难度:容易 设用一维数组A[m]存储循环队列,只设置一个队头指示器front和一个用以记录队列 中元素个数的计数器count。在此情况下,队空、队满的条件是什么?如何确定将要入队元素的位置? 题目答案: 队空条件为count=0;队满条件为count=m;将要入队元素的位置是 (front+count)%m 3. (3)分题目ID号:11144 题目难度:较易 在以顺序方式存储队列时,会出现“假溢出”现象,请解释这一现象,并说明解决“假溢出”的方法及其原理。 题目答案: 4. (2)分题目ID号:11679 题目难度:容易 改写顺序栈的进栈成员函数Push (x ),要求当栈满时执行一个stackFull ( )操作进行栈满处理。其功能是:动态创建一个比原来的栈数组大二倍的新数组,代替原来的栈数组,原来栈数组中的元素占据新数组的前MaxSize位置。 题目答案: 【解答】 template if ( isFull ( ) ) stackFull ( ); //栈满,做溢出处理 elements [ ++top ] = item; //进栈 } template for ( int i = 0; i <= top; i++ ) //传送原数组的数据 temp[i] = elements[i]; delete [ ] elements; //删去原数组 maxSize *= 2; //数组最大体积增长一倍 elements = temp; //新数组成为栈的数组空间 } 5. (4)分题目ID号:11680 题目难度:容易 铁路进行列车调度时, 常把站台设计成栈式结构的站台,如图所示。试问: (1) 设有编号为1,2,3,4,5,6的六辆列车, 顺序开入栈式结构的站台, 则可能的出栈序列有多少种? (2) 若进站的六辆列车顺序如上所述, 那么是否能够得到 435612, 325641, 154623和135426的出站序列, 如果不能, 说明为什么不能; 如果能, 说明如何得到(即写出"进栈"或"出栈"的序列)。 题目答案: 6. (3)分题目ID号:11681 题目难度:容易 试证明:若借助栈可由输入序列1, 2, 3, …,n得到一个输出序列p1, p2, p3, …,pn (它是输入序列的某一种排列),则在输出序列中不可能出现以下情况,即存在i < j < k,使得pj < pk < pi。(提示: 用反证法) 题目答案: 7. (3)分题目ID号:11683 题目难度:容易 设表达式的中缀表示为a * x - b / x↑2,试利用栈将它改为后缀表示ax * bx2↑/-。写出转换过程中栈的变化。 题目答案: 8. (3)分题目ID号:11684 题目难度:容易 已知A[n]为整数数组,试写出实现下列运算的递归算法: (1) 求数组A中的最大整数。 (2) 求n个整数的和。 (3) 求n个整数的平均值。 题目答案: 见ftp殷人昆---部分作业答案5-1 9. (4)分题目ID号:11685 题目难度:容易 已知Ackerman函数定义如下: (1) 根据定义,写出它的递归求解算法; (2) 利用栈,写出它的非递归求解算法。 题目答案: 见ftp 殷人昆-部分作业答案5-2 10. (1)分题目ID号:11686 题目难度:容易 【背包问题】设有一个背包可以放入的物品的重量为s,现有n件物品,重量分别为w[1], w[2], …,w[n]。问能否从这n件物品中选择若干件放入此背包中,使得放入的重量之和正好为s。如果存在一种符合上述要求的选择,则称此背包问题有解(或称其解为真);否则称此背包问题无解(或称其解为假)。试用递归方法设计求解背包问题的算法。(提示:此背包问题的递归定义如上:)题目答案: 11. (4)分题目ID号:11687 题目难度:容易 【八皇后问题】设在初始状态下在国际象棋棋盘上没有任何棋子(皇后)。然后顺序在第1行,第2行,…。第8行上布放棋子。在每一行中有8个可选择位置,但在任一时刻,棋盘的合法布局都必须满足3个限制条件,即任何两个棋子不得放在棋盘上的同一行、或者同一列、或者同一斜线上。试编写一个递归算法,求解并输出此问题的所有合法布局。(提示:用回溯法。在第n行第j列安放一个棋子时,需要记录在行方向、列方向、正斜线方向、反斜线方向的安放状态,若当前布局合法,可向下一行递归求解,否则可移走这个棋子,恢复安放该 棋子前的状态,试探本行的第j+1列。) 题目答案: 此为典型的回溯法问题。 在解决8皇后时,采用回溯法。在安放第i 行皇后时,需要在列的方向从 1 到n 试探( j = 1, …,n ):首先在第j 列安放一个皇后,如果在列、主对角线、次对角线方向有其它皇后,则出现攻击,撤消在第j 列安放的皇后。如果没有出现攻击,在第j 列安放的皇后不动,递归安放第i+1 行皇后。 解题时设置 4 个数组: col [n] :col[i] 标识第i 列是否安放了皇后 md[2n-1] :md[k] 标识第k 条主对角线是否安放了皇后 sd[2n-1] :sd[k] 标识第k 条次对角线是否安放了皇后 q[n] :q[i] 记录第i 行皇后在第几列 利用行号i和列号j计算主对角线编号k的方法是k = n+i-j-1;计 算次对角线编号k的方法是k = i+j。n皇后问题解法如下: void Queen( int i ) { for ( int j = 0; j < n; j++ ) { if ( col[j] == 0 && md[n+i-j-1] == 0 && sd[i+j] == 0 ) { //第i 行第j 列没有攻击 col[j] = md[n+i-j-1] = sd[i+j] = 1; q[i] = j;/ /在第i 行第j 列安放皇后 if ( i == n ) { //输出一个布局 for ( j = 0; j < n; j++ ) cout << q [j] << ‘,’; cout << endl; } else { Queen ( i+1 ); //在第i+1行安放皇后 col[j] = md[n+i-j-1] = sd[i+j] = 0; q[i] = 0; //撤消第i 行第j 列 的皇后 } } } 12. (3)分题目ID号:11688 题目难度:容易 已知f为单链表的表头指针, 链表中存储的都是整型数据,试写出实现下列运算的递归算法: (1) 求链表中的最大整数。 (2) 求链表的结点个数。 (3) 求所有整数的平均值。 题目答案: 见FTP 殷人昆---部分作业答案5-5 13. (3)分题目ID号:11805 题目难度:容易 假设以数组Q[m]存放循环队列中的元素, 同时以rear和length分