第3章栈和队列讲解.docx

上传人:b****6 文档编号:8528662 上传时间:2023-01-31 格式:DOCX 页数:20 大小:302.44KB
下载 相关 举报
第3章栈和队列讲解.docx_第1页
第1页 / 共20页
第3章栈和队列讲解.docx_第2页
第2页 / 共20页
第3章栈和队列讲解.docx_第3页
第3页 / 共20页
第3章栈和队列讲解.docx_第4页
第4页 / 共20页
第3章栈和队列讲解.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

第3章栈和队列讲解.docx

《第3章栈和队列讲解.docx》由会员分享,可在线阅读,更多相关《第3章栈和队列讲解.docx(20页珍藏版)》请在冰豆网上搜索。

第3章栈和队列讲解.docx

第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=rear;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   

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1