第3章栈和队列讲解

第3章栈和队列讲解
第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 &que){

T x;

stack tempst;

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||!&&!CE<||】

五、问答

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位置。

题目答案:

【解答】

templatevoid stack :: push ( const Type & item ) {

if ( isFull ( ) ) stackFull ( ); //栈满,做溢出处理

elements [ ++top ] = item; //进栈

}

template void stack :: stackFull ( ) { Type * temp = new Type [ 2 * maxSize ]; //创建体积大一倍的数组

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分

相关主题
相关文档
最新文档