收藏 分享(赏)

第三部分 栈 队列 带答案.doc

上传人:gnk289057 文档编号:8158626 上传时间:2019-06-11 格式:DOC 页数:10 大小:61.50KB
下载 相关 举报
第三部分 栈 队列 带答案.doc_第1页
第1页 / 共10页
第三部分 栈 队列 带答案.doc_第2页
第2页 / 共10页
第三部分 栈 队列 带答案.doc_第3页
第3页 / 共10页
第三部分 栈 队列 带答案.doc_第4页
第4页 / 共10页
第三部分 栈 队列 带答案.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、第三部分 栈 队列一、选择题1( A )又称为 FIFO 表。A.队列 B.散列表 C.栈 D.哈希表2设依次进入一个栈的元素序列为 c,a,b,d,不可得到出栈的元素序列有 (B D )。A.a.b,c,d B.a,d,c,b C.b,a,d,c D.c,d,a,b3. 链式栈与顺序栈相比,一个比较明显的优点是 ( B )。A. 插入操作更加方便 B. 通常不会出现栈满的情况C. 不会出现栈空的情况 D. 删除操作更加方便4. 在一个顺序存储的循环队列中,队头指针指向队头元素的 ( A )。A. 前一个位置 B. 后一个位置C. 队头元素位置 D. 队尾元素的前一位置5. 若一个栈的输入序列

2、是 1,2 ,3n,则输出序列的第一个元素是 n,则第 i 个输出元素是( C ) 。A n-i B i C n-i+1 D n-i-16. 栈的数组表示中,top 为栈顶指针,栈空的条件是( D )。(A) top=0 (B)top=maxSize (C )top=maxSize(D)top=-17. 在数组表示的循环队列中,front 、rear 分别为队列的头、尾指针,maxSize 为数组的最大长度,队满的条件是( B )。(A) front=maxSize ( B)(rear+1)%maxSize=front(C) rear=maxSize (D)rear=front8. 栈和队列的

3、共同特点是( C )。(A) 都是先进后出 (B )都是先进先出(C) 只允许在端点处插入和删除 (D)没有共同点9与中缀表达式 a+b*c-d 等价的前缀表达式是( C )。A.+a-*bcd B.*+-abcd C.-+a*bcd D.abcd+*-10中缀表达式 A-(B+C)*D/E 的后缀形式是( D )。A.ABC+-D*E/ B.ABC+D*-E/ C.ABC+D-*E/ D.ABC+D*E/-11若非空队列采用链式存储结构,front 和 rear 分别为队头元素与队列尾元素的指针,删除此时队列的一个元素的操作时依次执行 pfront,( D ),call RET(P)。A.f

4、rontlink(rear) B.rearlink(p) C.rearlink(front) D.frontlink(p)12由两个栈共享一个向量空间的好处是:( B )A减少存取时间,降低下溢发生的机率B节省存储空间,降低上溢发生的机率C减少存取时间,降低上溢发生的机率D节省存储空间,降低下溢发生的机率13数组 datam为循环队列的存储空间, front 为队头指针, rare 为队尾指针,则执行入队的操作为( D ) 。A rare=rare+1 B rare=(rare+1)%(m-1) C rare=(rare-1)%m D rare=(rare+1)%m14. 将递归算法转换成对应

5、的非递归算法时,通常需要使用( A )。(a)栈 (b)队列 (c)链表 (d)数组15下列关于栈的叙述中正确的是( D )。A. 在栈中只能插入数据 B. 在栈中只能删除数据C. 栈是先进先出的线性表 D. 栈是先进后出的线性表16下列关于队列的叙述中正确的是( C )。A. 在队列中只能插入数据 B. 在队列中只能删除数据C. 队列是先进先出的线性表 D. 队列是先进后出的线性表17栈和队列的共同点是( C )。A. 都是先进后出 B. 都是先进先出C. 只允许在端点处插入和删除元素 D. 没有共同点18栈底至栈顶依次存放元素 A、B、C、D,在第五个元素 E 入栈之前,栈中元素可以出栈,

6、则出栈序列可能是( D ) 。A. ABCED B. DBCEA C. CDABE D. DCBEA19表达式 a*(b+c)-d 的后缀表达式是( B )。A. abcd*+1 B. abc+*d- C. abc*+d- D. -+*abcd20设依次进入一个栈的元素序列为 c,a,b,d,不可得到的出栈的元素序列有( B D ) 。A. a,b,c,d B. a,d,c,b C. b,a,d,c D. c,d,a,b21当需要随机查找线性表的元素时,宜采用( C )作存储结构。A. 双向链表 B. 循环链表 C. 顺序表 D. 单链表22表达式采用逆波兰式表示时可以不用括号,而且可以用基于

7、( A )求值过程进行计算。A. 栈 B. 队列 C. 符号表 D. 散列表23与逆波兰式 ab+cd+*对应的中缀表达式是( C ) 。A. a+b+c*d B. (a+b)*c+d C. (a+b)*(c+d) D. a+b*c+d24初始为空的堆栈中依次插入元素 f、e 、d 、c、b 、a 以后,连续进行了三次删除操作,此时的栈顶元素是( B ) 。A. c B. d C. b D. e25某堆栈的输入序列为 1,2,3,n ,输出序列的第一个元素为 n,则第 i 个输出的元素为( C ) 。A. i B. n-i C. n-i+1 D. 哪个元素无所谓26循环单链表表示队列,正确的说

8、法是( B ) 。A. 可设一个头指针使入队、出队都方便B. 可设一个尾指针使入队、出队都方便C. 必须设头、尾指针才能使入队、出队都方便D. 无论如何,只可能使入队方便27在一个单链表中,若 q 所指结点是 p 所指结点的前驱结点,若在 q 与 p 之间插入一个 s 所指的结点,则执行( D ) 。A. s-link=p-link; p-link=s; B. p-link=s; s-link=q;C. p-link=s-link; s-link=p; D. q-link=s; s-link=p;二、填空题1在 n(n0) 个元素的顺序栈中删除 1 个元素的时间复杂度为: O(1)2设 SQ

9、为循环队列,存储在数组 dm 中,则 SQ 出队操作对其队头指针 front 的修改是 _ front = (front+1)%m 。3栈中元素的进出原则为 _先进后出_ 。4在解决计算机主机与打印机之间速度不匹配问题时通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则从该缓冲区中取出数据打印。该缓冲区应该是一个 队列 结构,其主要特点是 先进先出 。5对于一个以顺序实现的循环队列 Q0m-1,队头、队尾指针分别为 f、r ,其判空的条件是 r=f ,判满的条件是 (r+1)%m=f 。6在具有 n 个单元的循环队列中,队满时共有_n-1_个元素。7操作系统中先来先服务

10、是_队列_数据结构应用的典型例子。8设栈 S 和队列 Q 的初始状态为空,元素 a、b、c、d、e、f 依次通过栈 S,一个元素出栈后即进入队列 Q。若这 6 个元素出队列的顺序为 b、d、c、f、e、a,则栈S 的容量最少应该是 _3_。9用循环单链表表示的队列长度为 n,若只设头指针,则出队和入队的时间复杂度分别为_O(1) _和_ O(n)_;若只设尾指针,则出队和入队的时间复杂度分别为_ O(1)_和_ O(1)_。10用向量表示的循环队列的队首和队尾位置分别为 1 和 max_size,试给出判断队列为满的边界条件为:(max_size+1)%MAXSIZE=111若用一个大小为 6

11、 的数组来实现循环队列,且当前 rear 和 front 的值分别为 0和 3。当从队列中删除一个元素,再加入两个元素后,rear 和 front 的值分别为:2 和 4 。12已知链栈的结点结构包括数据域(data) 和指向下一个结点的指针域(next),栈顶指针为 top,则实现将指针 p 所指结点插入栈顶的语句依次为:1) p-next=top; 2) top=p;三、判断题1若某堆栈的输入序列为 1,2,3,4,则 4,3,1,2 不可能是堆栈的输出序列之一。 ( R )2删除非空链式存储结构的堆栈( 设栈顶指针为 top)的一个元素的过程是依次执行:ptop,toplink(p),c

12、all RET(p)。( R )1 若队列采用链式存储结构,队头指针与指针分别为 front 和 rear,向队列中插入一个数据信息为 item 的新元素的过程是依次执行 :call GETNODE(p),data(P)item,rear p,frontp。( W )四、操作题1依次输入元素 X,Y,Z, 插入到一个初始状态为空的链式栈中, 试画出空的链式栈和每插入一个元素之后的链式栈示意图。2指出程序段完成的功能?vode Demo1(SeqStack *S) int i, arr64, n=0;while(!StackEmpty(S) arrn+ =Pop(S);for(i=0; i vo

13、id List : Inverse ( ) if ( first = NULL ) return; ListNode *p = firstlink;, *pr = NULL;while ( p != NULL ) firstlink = pr; /逆转 first 指针pr = first; first = p; p = plink; /指针前移first-link=pr;【解答 2】template void List : Inverse ( ) ListNode *p, *head = new ListNode ( );while ( first != NULL ) p = first;

14、first = firstlink; /摘下 first 链头结点plink = headlink; headlink = p; /插入 head 链前端first = headlink; delete head; /重置 first4把 A 、 B 、 C 、 D 依次进栈(栈初始为空) ,任何时刻(只要栈不空) ,都可以出(退)栈,试写出所有可能的出栈序列(如 A B C D ) 。5用算符优先法求下列算术表达式 12+20/(10-2*3)的值,试简要说明求值过程, 画出操作数栈和运算符栈的主要变化过程。6依次将元素 A,C,D,B 插入一个初始状态为空的链式栈中,试画出所有插入完成之后

15、的链式栈。7有 5 个元素,其入栈次序为 A、B、C、D、E ,在各种可能的出栈次序中,以元素C 第一个出栈且 D 第二个出栈的次序有哪几个?CDEBA、CDBEA、CDBAE五、程序题1假设以带头结点的循环单链表表示队列,并且只设一个指针 rear 指向队尾结点,不设头指针,请写出相应的入队和出队算法。入队算法:void Equeue(Slink *tail, ElemType x) Slink *s;s=(Slink *)malloc(sizeof(Slink);s-data = x;s-next=rear-next;rear-next = s;rear = s;出队算法:int Oque

16、ue(Slink *tail, ElemType *e) Slink *p;if(rear-next = rear) return 0;p=rear-next-next;if(p=rear)rear=rear-next;rear-next=rear;elserear-next-next=p-next;*e=p-data;free(p);return 1;2试写一个判别表达式中开、闭括号是否配对出现的算法int match(char *str)/*判别表达式中小括号是否匹配,若匹配则返回 1,否则返回 0*/ Stack S;int i=0;S.top=-1;While(stri!=0)If(s

17、tri= ()s.top+;s.datas.top=(;i+;elseif(stri= )if(S.top=0) return 0;else return 1;3假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针) ,编写相应的置队空、判队空、入队和出队的算法。算法如下:/先定义链队结构:typedef struct queuenodeDatatype data;struct queuenode *next;QueueNode; /以上是结点类型的定义typedef structqueuenode *rear;LinkQueue; /只设一个指向队尾元素的指针(

18、1)置空队void InitQueue( LinkQueue *Q) /置空队:就是使头结点成为队尾元素QueueNode *s;Q-rear = Q-rear-next;/将队尾指针指向头结点while (Q-rear!=Q-rear-next)/当队列非空,将队中元素逐个出队s=Q-rear-next;Q-rear-next=s-next;free(s);/回收结点空间(2)判队空 int EmptyQueue( LinkQueue *Q) /判队空/ 当头结点的 next 指针指向自己时为空队return Q-rear-next-next=Q-rear-next;(3)入队void En

19、Queue( LinkQueue *Q, Datatype x) /入队/ 也就是在尾结点处插入元素QueueNode *p=(QueueNode *) malloc (sizeof(QueueNode);/申请新结点p-data=x; p-next=Q-rear-next;/初始化新结点并链入Q-rear-next=p; Q-rear=p;/将尾指针移至新结点(4)出队Datatype DeQueue( LinkQueue *Q)/出队,把头结点之后的元素摘下Datatype t;QueueNode *p;if(EmptyQueue( Q )Error(“Queue underflow“);p=Q-rear-next-next; /p 指向将要摘下的结点x=p-data; /保存结点中数据if (p=Q-rear)/当队列中只有一个结点时, p 结点出队后,要将队尾指针指向头结点Q-rear = Q-rear-next; Q-rear-next=p-next;else Q-rear-next-next=p-next;/摘下结点 pfree(p);/释放被删结点return x;

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报