数据结构及应用算法教程习题第四章 栈和队列
栈和队列答案

一、选择题1.B2.1B 2.2A 2.3B 2.4D 2.5.C3.B4.D5.D6.C7.D8.B9.D 10.D 11.D 12.C 13.B 16.D 17.B 19.B21.D 22.D 23.D 24.C 26.A 28.B 29.BD 30.C 31.B 32.C33.1B 33.2A 33.3C 33.4C 33.5F 34.C 35.C 36.A 37.AD二、判断题2.√ 5.×9. √10.×14.×15. √16.×18.×19.√三、填空题1、操作受限(或限定仅在表尾进行插入和删除操作)后进先出3、3 1 26、两栈顶指针值相减的绝对值为1(或两栈顶指针相邻)。
7、(1)满 (2)空 (3)n (4)栈底 (5)两栈顶指针相邻(即值之差的绝对值为1)9、S×SS×S×× 10、data[++top]=x;12、假溢出时大量移动数据元素。
13、(M+1) MOD N (M+1)% N; 14、队列 15、先进先出 16、先进先出17、s=(LinkedList)malloc(sizeof(LNode)); s->data=x;s->next=r->next;r->next=s;r=s;18、牺牲一个存储单元设标记19、(TAIL+1)MOD M=FRONT (数组下标0到M-1,若一定使用1到M,则取模为0者,值改取M22、(rear-front+m)% m; 23、(R-P+N)% N;四、应用题3、用常规意义下顺序存储结构的一维数组表示队列,由于队列的性质(队尾插入和队头删除),容易造成“假溢出”现象,即队尾已到达一维数组的高下标,不能再插入,然而队中元素个数小于队列的长度(容量)。
循环队列是解决“假溢出”的一种方法。
通常把一维数组看成首尾相接。
在循环队列下,通常采用“牺牲一个存储单元”或“作标记”的方法解决“队满”和“队空”的判定问题。
数据结构肖启宏课后习题答案第四章

一. 名词解释(1)栈——只允许在一端进行插入或删除操作的线性表称为栈。
其最大的特点是“后进先出”。
(2)顺序栈——采用顺序存储结构的栈称为顺序栈。
(3)链栈——采用链式存储结构的栈称为链栈。
(5)队列——只允许在一端进行插入,另一端进行删除操作的线性表称为队列。
其最大的特点是“先进先出”。
(6)顺序队列——采用顺序存储结构的队列称为顺序队列。
(7)链队列——采用链式存储结构的称队列为链队列。
(8)循环队列——为了解决顺序队列中“假溢出”现象,将队列的存储空间想象为一个首尾相链的环(即把队头元素与对尾元素链结起来),存储在其中的队列称为循环队列。
二.判断题(下列各题,正确的请在前面的括号内打√;错误的打ㄨ)(1)√(2)√(3)ㄨ(4)ㄨ(5)ㄨ(6)ㄨ(7)√(8)√(9)ㄨ(10)√(11)ㄨ(12)ㄨ三. 填空题(1)后进先出(2)栈顶栈底(3)栈空栈满(4)O(1)O(1)(5)必须一致(6)栈(7)栈空(8)p->next=top top=p(9)- - + +(10)LS->next 首(11)先进先出(12)队尾队头(13)队列是否为空队列是否为满(14)可变的(15)-1 NULL(16)O(n) O(1) O(1) O(1)(17)front==rear front==(rear+1)% MAXLEN MAXLEN-front (18)空只含有一个结点(19)front==rear && front <>NULL(20)队尾指针写入四. 选择题(1)C (2)A (3)D (4)B (5)C(6)D (7)B (8)A (9)A (10)D(11)A (12)A (13)C (14)A (15)B (16) A五、简答题答:n个(同类)数据元素的有限序列称为线性表。
线性表的特点是数据元素之间存在“一对一”的关系。
栈和队列都是操作受限制的线性表,它们和线性表一样,数据元素之间都存在“一对一”的关系。
栈和队列习题

栈和队列习题4.1 判断题(在你认为正确的题后的括号中打√,否则打X)。
(1)堆栈和队列都是特殊的线性表。
( )(2)堆栈和队列都将插入和删除操作限制在表的端点处进行。
( )(3)只允许在表的一端进行插入和删除操作的线性表称为堆栈。
( )(4)没有元素的堆栈称为空栈,空栈用不着栈顶指针。
( )(5)只要堆栈不空,就能任意删除堆栈的元素。
( )(6)堆栈允许删除的一端称为栈顶,而栈底元素是不能删除的。
( )(7)n个元素进栈的顺序一定与它们出栈的顺序相反。
( )(8)对采用链式存储结构的堆栈进行操作不必判断溢出。
( )(9)给出顺序堆栈的栈顶元素位置的指针是一个指针类型的变量。
( )(10)判断顺序堆栈是否为空的标志是top是否等于0(top为栈顶指针)。
( )(11)插入和删除操作比较简单是链接堆栈和链接队列的优点之一。
( )(12)n个元素进队的顺序与它们出队的顺序一定是相同的。
( )(13)没有任何元素的队列称为空队。
空队用不着队头指针与队尾指针。
( )(14)元素进出队列一定满足“先进先出”的规律。
( )(15)链接队列不存在溢出问题。
( )(16)在链接队列中删除一个元素是在链表的最前端进行的。
( )(17)采用循环链表作为存储结构的队列称为循环队列。
( )(18)堆栈和队列都可以用来解决递归问题。
( )(19)堆栈和队列都不适合采用散列存储方法。
( )(20)无论是顺序队列还是链接队列,插入、删除操作的时间复杂度都是O(1)。
( )4.2单项选择题。
(1)堆栈和队列的共同之处在于它们具有相同的——。
A.逻辑特性B.物理特性C.运算方法D.元素类型(2)堆栈和队列都是特殊的线性表,其特殊性在于_______。
A.它们具有一般线性表所没有的逻辑特性B.它们的存储结构比较特殊C.对它们的使用方法做了限制D.它们比一般线性表更简单(3)若5个元素的出栈序列为1,2,3,4,5,则进栈序列可能是——。
数据结构习题参考答案

数据结构习题参考答案一、栈和队列1. 栈是一种具有后进先出(Last In First Out)特性的线性数据结构。
常用方法:- push(x): 将元素x压入栈顶;- pop(): 弹出栈顶元素;- top(): 返回栈顶元素;- isEmpty(): 判断栈是否为空;例题解答:(1)题目描述:使用栈实现队列的功能。
解答:使用两个栈,一个用于入队操作,一个用于出队操作。
入队操作:直接将元素压入入队栈中;出队操作:如果出队栈为空,则将入队栈的元素逐个弹出并压入出队栈,此时出队栈的栈顶元素即为要弹出的元素。
复杂度分析:入队操作的时间复杂度为O(1),出队操作的平均时间复杂度为O(1)。
(2)题目描述:判断括号序列是否合法,即括号是否完全匹配。
解答:使用栈来处理括号序列,遇到左括号则入栈,遇到右括号则与栈顶元素进行匹配,如果匹配成功则继续处理剩余字符,如果不匹配则判定为非法序列。
算法步骤:- 初始化一个空栈;- 从左到右遍历括号序列,对于每个字符执行以下操作:- 如果是左括号,则将其入栈;- 如果是右括号,则将其与栈顶元素进行匹配:- 如果栈为空,则判定为非法序列;- 如果栈顶元素与当前字符匹配,则将栈顶元素出栈,继续处理剩余字符;- 如果栈顶元素与当前字符不匹配,则判定为非法序列。
- 遍历结束后,如果栈为空,则括号序列合法;否则,括号序列非法。
复杂度分析:时间复杂度为O(n),其中n为括号序列的长度。
2. 队列是一种具有先进先出(First In First Out)特性的线性数据结构。
常用方法:- enqueue(x): 将元素x入队;- dequeue(): 出队并返回队首元素;- getFront(): 返回队首元素;- isEmpty(): 判断队列是否为空;例题解答:(1)题目描述:使用队列实现栈的功能。
解答:使用两个队列,一个用于入栈操作,一个用于出栈操作。
入栈操作:直接将元素入队入栈队列中;出栈操作:如果出栈队列为空,则将入栈队列的元素逐个出队并入队出栈队列,此时出栈队列的队首元素即为要出栈的元素。
栈和队列习题及答案

栈和队列习题及答案【篇一:栈和队列练习题答案】xt>一、填空题1. 线性表、栈和队列都是结构,可以在线性表的在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。
2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为。
不允许插入和删除运算的一端称为栈底。
3. 是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
二、判断正误(√)1. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。
(√)2. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。
正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
(√)4. 栈和队列的存储方式既可是顺序方式,也可是链接方式。
(√)5. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。
错,有可能。
三、单项选择题(b)1.栈中元素的进出原则是A.先进先出B.后进先出C.栈空则进D.栈满则出(c)2.若已知一个栈的入栈序列是1,2,3,?,n,其输出序列为p1,p2,p3,?,pn,若p1=n,则pi为A.i B.n-iC.n-i+1 D.不确定解释:当p1=n,即n是最先出栈的,根据栈的原理,n必定是最后入栈的(事实上题目已经表明了),那么输入顺序必定是1,2,3,?,n,则出栈的序列是n,?,3,2,1。
(若不要求顺序出栈,则输出序列不确定)(d)3.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为(A)r-f; (B)(n+f-r)% n; (C)n+r-f;(D)(n+r -f)% n e:①1 ②2 ③ 3 ④ 0四、阅读理解1. 【严题集3.3②】写出下列程序段的输出结果(栈的元素类型selem type为char)。
《数据结构与算法》习题与答案

《数据结构与算法》习题与答案(解答仅供参考)一、名词解释:1. 数据结构:数据结构是计算机存储、组织数据的方式,它不仅包括数据的逻辑结构(如线性结构、树形结构、图状结构等),还包括物理结构(如顺序存储、链式存储等)。
它是算法设计与分析的基础,对程序的效率和功能实现有直接影响。
2. 栈:栈是一种特殊的线性表,其操作遵循“后进先出”(Last In First Out, LIFO)原则。
在栈中,允许进行的操作主要有两种:压栈(Push),将元素添加到栈顶;弹栈(Pop),将栈顶元素移除。
3. 队列:队列是一种先进先出(First In First Out, FIFO)的数据结构,允许在其一端插入元素(称为入队),而在另一端删除元素(称为出队)。
常见的实现方式有顺序队列和循环队列。
4. 二叉排序树(又称二叉查找树):二叉排序树是一种二叉树,其每个节点的左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。
这种特性使得能在O(log n)的时间复杂度内完成搜索、插入和删除操作。
5. 图:图是一种非线性数据结构,由顶点(Vertex)和边(Edge)组成,用于表示对象之间的多种关系。
根据边是否有方向,可分为有向图和无向图;根据是否存在环路,又可分为有环图和无环图。
二、填空题:1. 在一个长度为n的顺序表中,插入一个新元素平均需要移动______个元素。
答案:(n/2)2. 哈希表利用______函数来确定元素的存储位置,通过解决哈希冲突以达到快速查找的目的。
答案:哈希(Hash)3. ______是最小生成树的一种算法,采用贪心策略,每次都选择当前未加入生成树且连接两个未连通集合的最小权重边。
答案:Prim算法4. 在深度优先搜索(DFS)过程中,使用______数据结构来记录已经被访问过的顶点,防止重复访问。
答案:栈或标记数组5. 快速排序算法在最坏情况下的时间复杂度为______。
第4章栈和队列习题

补充习题: 补充习题:
5.设有一空栈,现有输入序列为1,2,3,4,5,经过PUSH,PUSH, 5.设有一空栈,现有输入序列为1,2,3,4,5,经过PUSH,PUSH, 设有一空栈 1,2,3,4,5,经过PUSH,PUSH POP,PUSHБайду номын сангаасPOP,PUSH,PUSH后 输出序列为( POP,PUSH,POP,PUSH,PUSH后,输出序列为( )。 B) C) D) A)5,4,3,2,1 B)2,1 C)2,3 D)2,4 6.下面哪种数据结构不适合作栈的存储结构 下面哪种数据结构不适合作栈的存储结构( 6.下面哪种数据结构不适合作栈的存储结构( )。 A)数组 B)单链表 C)静态链表 D)二叉树结构 7.设计一个判别表达式中左右括号是否配对出现的算法 设计一个判别表达式中左右括号是否配对出现的算法, 7.设计一个判别表达式中左右括号是否配对出现的算法,最 好采用( 结构。 好采用( )结构。 A)线性表 B)队列 C)堆栈 D)树 8.队列的操作原则是 队列的操作原则是( 8.队列的操作原则是( ) 。 A)先进先出 B)先进后出 C)只能进行插入 D)只能进行删除 5.C 6.D 7.C 8.A
习题4.4 习题
#include "sqstack.h" void main() { SqStack S; InitStack(S); SElemType e; char a[80]; cout<<"放入一个以 为结束符的字符序列 放入一个以@为结束符的字符序列 放入一个以 为结束符的字符序列\n"; cin>>a; int i=0; while(a[i]!='&'&&a[i]!='@') { Push(S,a[i]); i++; } if(a[i]=='&') i++; while(a[i]!='@'&&!StackEmpty(S)) { Pop(S,e); if(e!=a[i]) break; i++; } if(a[i]=='@'&&StackEmpty(S)) cout<<"属于序列 属于序列1&序列 的字符序列 序列2的字符序列 属于序列 序列 的字符序列\n"; else cout<<"不属于序列 不属于序列1&序列 的字符序列 序列2的字符序列 不属于序列 序列 的字符序列\n"; }
栈和队列习题_数据结构

习题三栈和队列一单项选择题1. 在作进栈运算时,应先判别栈是否(①),在作退栈运算时应先判别栈是否(②)。
当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为(③)。
①, ②: A. 空 B. 满 C. 上溢 D. 下溢③: A. n-1 B. n C. n+1 D. n/22.若已知一个栈的进栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,...,pn,若p1=3,则p2为( )。
A 可能是2B 一定是2C 可能是1D 一定是13. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列()A. 5 4 3 6 1 2B. 4 5 3 1 2 6C. 3 4 6 5 2 1D. 2 3 4 1 5 64.设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出栈的顺序是s2,s3,s4, s6 , s5,s1,则栈的容量至少应该是()B. 3C. 55. 若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是()。
A. |top[2]-top[1]|=0B. top[1]+1=top[2]C. top[1]+top[2]=mD. top[1]=top[2]6. 执行完下列语句段后,i值为:()int f(int x){ return ((x>0) x* f(x-1):2);}int i ;i =f(f(1));A.2 B. 4 C. 8 D. 无限递归7. 表达式3* 2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为(),其中^为乘幂。
A. 3,2,4,1,1;(*^(+*-B. 3,2,8;(*^-C. 3,2,4,2,2;(*^(-D. 3,2,8;(*^(-8. 用链接方式存储的队列,在进行删除运算时()。
数据结构习题精编:栈和队列-数据结构栈和队列考题

20.假设以数组A[n]存放循环队列的元素,其头指针front指向队头元素的前一个位
置、尾指针rear指向队尾元素所在的存储位置,则在少用一个元素空间的前提下,
队列满的判定条件为
A.rear= =frontB.(front+1)%n= =rear
A.3、2、8;# * ^ -B.3、2、4、1、1;# * ^ ( + * -
C.3、2、8;# * ^ ( -D.3、2、4、2、2;# * ^ ( -
19.设数组A[m]为循环队列Q的存储空间,front为队头指针,rear为队尾指针,则
判定Q为空队列的条件是
A..front= =rearB.(rear-front)%m= =1
C.rear+1= =frontD.(rear+1)%n= =front
21.循环队列sq中,用数组elem[0..25]存放数据元素,sq.front指示队头元素的前一
个位置,sq.rear指示队尾元素的当前位置,设当前sq.front为20,sq.rear为12,则
当前队列中的元素个数为
A.8B.16C.17D.18
C.top[1]+top[2]==mD.top[2]-top[1]!=0
17.表达式a*(b+c)-d的后缀表达式是
A.abcd*+-B.abc+*d-C.abc*+d-D.-+*abcd
18.在表达式3* 2^(4+2*2-6*3)-5(其中^为乘幂)求值过程中,当扫描到6时,操作数
栈和操作符栈分别为
为25,则rear应指向的元素是
数据结构答案第4章队列学习指导

数据结构答案第4章队列学习指导第4章队列4.1 知识点分析1.队列的基本概念(1)队列是⼀种特殊的、只能在表的两端进⾏插⼊或删除操作的线性表。
允许插⼊元素的⼀端称为队尾,允许删除元素的⼀端称为队⾸。
(2)队列的逻辑结构和线性表相同,其最⼤特点是―先进先出‖。
(3)队列的存储结构有顺序队列和链队列之分,要求掌握队列的C语⾔描述⽅法。
(4)重点掌握在顺序队列和链队列上实现:进队、出队、读队头元素、显⽰队列元素、判队空和判队满等基本操作。
(5)熟悉队列在计算机软件设计中的典型应⽤,能灵活应⽤队列的基本原理解决⼀些实际应⽤问题。
2.顺序队列(1)顺序队列⽤内存中⼀组连续的存储单元顺序存放队列中各元素,⼀般⽤⼀维数组作为队列的顺序存储空间。
除了队列的数据以外,⼀般还设有队⾸和队尾两个指针。
typedef struct{ datatype Q[MAXLEN];int front=–1, rear=–1;// 定义队头、队尾指针,并置队列为空}Queue;(2)顺序队列缺点是存在―假溢出‖现象。
3.循环队列(1)为了解决顺序队列中的“假溢出”现象,把数组想象成⼀个⾸尾相连的环,即队⾸的元素Q[0]与队尾的元素Q[MAXLEN–1]连接起来,存储在其中的队列称为循环队列。
(2)⼀般规定:当front= =rear,表⽰循环队列为空;当front= =(rear+1)% MAXLEN,表⽰循环队列为满。
(3)在定义结构体时,附设⼀个存储循环队列中元素个数的变量n,当n= =0时表⽰队空;当n= = MAXLEN时为队满。
循环队列的结构体类型定义:typedef struct{ datatype data[MAXLEN];int front,rear;int n;// ⽤以记录循环队列中元素的个数}csequeue;// 循环队列变量名(4)⼊队操作时:p->rear= (p->rear+1) % MAXLEN;出队操作时:p->front= (p->front+1) % MAXLEN;4.链队列(1)队列的链式存储结构称为链队列(或链队)。
栈和队列练习

栈和队列一、选择题1、一个栈的输入序列为:a,b,c,d,e,则栈的不可能输出的序列是( C )。
A. a,b,c,d,eB. d,e,c,b,aC. d,c,e,a,bD. e,d,c,b,a2、判断一个循环队列Q(最多n个元素)为满的条件是( C )。
A. Q->rear==Q->frontB. Q->rear==Q->front+1C. Q->front==(Q->rear+1)%nD. Q->front==(Q->rear-1)%n3、设计一个判别表达式中括号是否配对的算法,采用( D )数据结构最佳。
A. 顺序表B. 链表C. 队列D. 栈4、5、一个栈的输入序列为:1,2,3,4,则栈的不可能输出的序列是( D )。
A. 1243B. 2134C. 1432D. 4312E. 32146、若用一个大小为6的数组来实现循环队列,且当rear和front的值分别为0,3。
当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为(B )。
A. 1和5B. 2和4C. 4和2D. 5和17、队列的插入操作是在( A )。
A. 队尾B. 队头C. 队列任意位置D. 队头元素后8、循环队列的队头和队尾指针分别为front和rear,则判断循环队列为空的条件是( A )。
A. front==rearB. front==0C. rear==0D. front=rear+19、一个顺序栈S,其栈顶指针为top,则将元素e入栈的操作是( A )。
A. *S->top=e;S->top++;B. S->top++;*S->top=e;C. *S->top=eD. S->top=e;10、表达式a*(b+c)-d的后缀表达式是( B )。
A. abcd+-B. abc+*d-C. abc*+d-D. -+*abcd11、将递归算法转换成对应的非递归算法时,通常需要使用( B )来保存中间结果。
数据结构实验4栈与队列答案-推荐下载

实验报告院(系):信息科学与技术学院课程名称:数据结构日期:班级学号实验室专业姓名计算机号实验名称栈与队列的基本使用成绩评定所用软件V C或TC教师签名实验目的1.掌握栈与队列的基本概念2.掌握顺序栈的建立、入栈和出栈等方法。
3.掌握循环队列的概念和建立、入队出队方法。
4.了解链栈、链队的概念及有关操作。
实验准备1、复习书上有关内容。
2、阅读实验内容1,写出子函数功能并进行程序填空。
3、阅读实验内容2,写出各子函数功能4、编出实验内容3 的源程序。
实验内容一、栈的基本操作利用栈将一个十进制数字转换成一个二进制数。
请写出子函数功能并进行程序填空再上机运行。
(1)程序如下:#include "stdio.h"#include "stdlib.h"#define Stack_size 30typedef struct{int elem[Stack_size];int top; }SeqStack;void InitStack(SeqStack *s){s->top=-1;}int Push(SeqStack *s,int x){if(s->top==Stack_size-1) return(0);s->top++;s->elem[s->top]=x;return(1);}int Pop(SeqStack *s,int *x){if (s->top==-1)return 0;else*x=s->elem[s->top];s->top--;return(1);}int IsEmpty(SeqStack s){if(s.top==-1) return 1;else return(0); }void Conversion(int N){SeqStack S;int x;InitStack(&S);while(N>0){x=N%2;Push(&S,x);N=N/2; }while(!IsEmpty(S)){Pop(&S,&x);printf("%d",x);}}void main(){int x;printf("Enter a number:");scanf("%d",&x);Conversion(x);}二、队列的基本操作:#define qsize 50#include "stdio.h"typedef struct{int data[qsize];int front,rear;} sqqueue;int inqueue(sqqueue *q,int x) //入队运算{if((q->rear+1==q->front)){ printf("queue overflow");return 0;}q->data[q->rear]=x;q->rear=(q->rear+1)%qsize;return(1);}int dequeue(sqqueue *q) //出队运算{int temp;if (q->rear==q->front){ printf("queue underflow");return(0);}temp=q->data[q->front];q->front=(q->front+1)%qsize;return(temp); }void prin(sqqueue *q) //输出{int i;printf("\n");for(i=q->front;i!=q->rear;i=(i+1)%qsize)printf(" %d",q->data[i]);printf("\n");}void main() //主函数{sqqueue sq;int I;sq.front=0; //队列初始化sq.rear=0;for (I=0;I<5;I++){sq.data[I]=I*I;sq.rear++;} //元素入队,建立原始队列printf("\n初始队列为:\n");prin(&sq);//输出队列inqueue(&sq,99);//将元素99入队printf("\n99入队后队列变为:\n");prin(&sq);//输出队列dequeue(&sq); //将队首元素出队printf("\n出队一个元素后队列变为:\n");prin(&sq);//输出队列}三、写出一个借助于栈将一个单链表逆置的C语言函数,并上机调试。
数据结构及应用算法教程习题第四章栈和队列

数据结构及应用算法教程习题第四章栈和队列第四章栈和队列一、选择题1.对于栈操作数据的原则是(B )。
A.先进先出B.后进先出C.后进后出D.不分顺序2.一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是( B )。
A.不确定B.n-i+1 C.i D.n-i3.有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?( C )A.5 4 3 6 1 2 B.4 5 3 1 2 6 C.3 4 6 5 2 1 D.2 3 4 1 5 6 4.设栈的输入序列是1,2,3,4,则()不可能是其出栈序列。
A.1,2,4,3,B.2,1,3,4,C.1,4,3,2,D.4,3,1,2,E.3,2,1,4,5.某堆栈的输入序列为a, b,c ,d,下面的四个序列中,不可能是它的输出序列的是()。
A.a,c,b,d B.b, c,d,a C.c, d,b, a D.d, c,a,b 6.设有三个元素X,Y,Z顺序进栈(进的过程中允许出栈),下列得不到的出栈排列是( )。
A.XYZ B.YZX C.ZXY D.ZYX 7.输入序列为ABC,可以变为CBA时,经过的栈操作为(B )A.push,pop,push,pop,push,pop B.push,push,push,pop,pop,pop C.push,push,pop,pop,push,pop D.push,pop,push,push,pop,pop8.若一个栈以向量V[1..n]存储,初始栈顶指针top为n+1,则下面x进栈的正确操作是( C )。
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-110.栈在( D )中应用。
A.递归调用B.子程序调用C.表达式求值D.A,B,C11.一个递归算法必须包括( B )。
栈和队列答案

3.1 若按教科书 3.1.1 节中图 3.1(b) 所示铁道进行车厢调度(注意:两侧铁道均为单向行驶道),则请回答:(1) 如果进站的车厢序列为123,则可能得到的出站车厢序列是什么?(2)如果进站的车厢序列为 123456,则能否得到 435612 和 135426 的出站序列,并请说明为什么不能得到或者如何得到(即写出以‘S’表示进栈和以‘ X’表示出栈的栈操作序列)。
解: (1) 123 231 321 213 132(2) 可以得到明12 已经在栈中,135426 的出站序列,但不能得到1 不可能先于2 出栈。
435612的出站序列。
因为4356 出站说3.2简述栈和线性表的差别。
解:线性表是具有相同特性的数据元素的一个有限序列。
栈是限定仅在表尾进行插入或删除操作的线性表。
3.3写出下列程序段的输出结果(栈的元素类型SElemType 为 char )。
void main(){Stack S;char x,y;InitStack(S);x= ‘ c’ ; y=‘ k’ ;Push(S,x);Push(S,‘ a’ ); Push(S,y);Pop(S,x);Push(S,‘ t’ ); Push(S,x);Pop(S,x);Push(S,‘ s’ );while(!StackEmpty(S)) { Pop(S,y); printf(y); }printf(x);}解: stack3.4简述以下算法的功能(栈的元素类型SElemType为int)。
(1)status algo1(Stack S){int i,n,A[255];n=0;while(!StackEmpty(S)) { n++; Pop(S,A[n]); }for(i=1;i<=n;i++) Push(S,A[i]);}(2)status algo2(Stack S,int e){Stack T; int d;InitStack(T);while(!StackEmpty(S)){Pop(S,d);if(d!=e) Push(T,d);}while(!StackEmpty(T)){Pop(T,d);Push(S,d);}}解: (1)栈中的数据元素逆置(2)如果栈中存在元素e,将其从栈中清除3.5假设以S和X分别表示入栈和出栈的操作,则初态和终态均为空栈的入栈和出栈的操作序列可以表示为仅由S 和 X 组成的序列。
数据结构第4章答案

一、填空题(每空1分,共15分)1. 向量、栈和队列都是线性结构,可以在向量的任何位置插入和删除元素;对于栈只能在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。
2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。
不允许插入和删除运算的一端称为栈底。
3. 队列是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
4. 在一个循环队列中,队首指针指向队首元素的前一个位置。
5. 在具有n个单元的循环队列中,队满时共有n-1 个元素。
6. 向栈中压入元素的操作是先存入元素,后移动栈顶指针。
7.从循环队列中删除一个元素时,其操作是先移动队首指针,后取出元素。
8.带表头结点的空循环双向链表的长度等于0。
二、判断正误(判断下列概念的正确性,并作出简要的说明。
)(每小题1分,共10分)(×)1. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。
(×)2. 在表结构中最常用的是线性表,栈和队列不太常用。
(√)3. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。
(√)4. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。
(×)5. 栈和链表是两种不同的数据结构。
(×)6. 栈和队列是一种非线性数据结构。
(√)7. 栈和队列的存储方式既可是顺序方式,也可是链接方式。
(√)8. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。
(×)9. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。
(×)10. 一个栈的输入序列是12345,则栈的输出序列不可能是12345。
三、单项选择题(每小题1分,共20分)(B)1.栈中元素的进出原则是A.先进先出B.后进先出C.栈空则进D.栈满则出(C)2. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为A.i B.n=i C.n-i+1 D.不确定(B)3. 判定一个栈ST(最多元素为m0)为空的条件是A.ST->top<>0 B.ST->top=0 C.ST->top<>m0 D.ST->top=m0(A)4. 判定一个队列QU(最多元素为m0)为满队列的条件是A.QU->rear-QU->front = = m0 B.QU->rear -QU->front -1= = m0 C.QU->front = = QU->rear D.QU->front = = QU->rear+1(D)5.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为(A)r-f; (B)(n+f-r)% n;(C)n+r-f; (D)(n+r-f)% n6.设有4个数据元素a1、a2、a3和a4,对他们分别进行栈操作或队操作。
栈和队列习题集【精选】

栈和队列部分习题一、单项选择题1.栈的插入和删除操作在______进行。
A、栈顶B、栈底C、任意位置D、指定位置2.在栈中存取数据的原则是______。
A、先进先出B、后进先出C、后进后出D、随意进出3.当利用大小为N的数组顺序存储一个栈时,假定用top==N表示栈空,则向这个栈插入一个元素时,首先应执行______语句修改top指针。
A、top++;B、top--;C、top=0;D、top=N-1;4.判断一个由ST指向的栈(最多元素m0)为满的条件是______。
A、ST->top !=0B、ST->top= =0C、ST->top!=m0D、ST->top = =m0-15.对于顺序栈stack[0..m],假设栈底在stack[0]处,并用top指向栈顶元素之后的空位置,则判断栈空的条件是______。
A、top= = -1B、top= =0C、top= =1D、top==n-16.假定利用数组a[N+1]顺序存储一个栈,用top表示栈顶指针,用top=N+1表示栈空,该数组所存储的栈的最大长度为N,则表示栈满的条件为______。
A、top==1B、top==-1C、top=0D、top=N-17.假定利用数组a[N]顺序存储一个栈,用top表示栈顶指针,用top==-1表示栈空,并已知栈未满,当元素x进栈时所执行的操作为______。
A、a[--top]=x;B、a[top--]=x;C、a[++top]=x;D、a[top++]=x;8.假定利用数组a[N]顺序存储一个栈,用top表示栈顶指针,用top==-1表示栈空,并已知栈未空,当退栈并返回栈顶元素时所执行的操作为______。
A、return a[--top];B、return a[top--];C、return a[++top];D、return a[top++];9.假定一个链式栈的栈顶指针用top表示,该链式栈为空的条件______。
栈与队列习题参考附标准答案

习题三参考答案备注: 红色字体标明的是与书本内容有改动的内容。
一、选择题1.在栈中存取数据的原则是( B )。
A.先进先出 B. 先进后出C. 后进后出D. 没有限制2.若将整数1、2、3、4依次进栈,则不可能得到的出栈序列是( D )。
A.1234 B. 1324 C. 4321 D. 14233.在链栈中,进行出栈操作时(B )。
A.需要判断栈是否满 B. 需要判断栈是否为空C. 需要判断栈元素的类型D. 无需对栈作任何差别4.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize,则顺序栈的判空条件是( A )。
A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-15.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize。
则顺序栈的判满的条件是( C )。
A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-16.在队列中存取数据元素的原则是( A )。
A.先进先出 B. 先进后出C. 后进后出D. 没有限制7.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front 和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判空条件是(A )。
A.front==rear B. front!=rearC. front==rear+1D. front==(rear+1)% maxSize8.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front 和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判满条件是(D )。
A.front==rear B. front!=rearC. front==rear+1D. front==(rear+1)% maxSize9.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的长度是(C )。
《数据结构与算法》章节测试答案

数据结构与算法章节测试答案第一章:数据结构简介1.1 什么是数据结构?数据结构是一种组织和存储数据的方式,它定义了数据的组织形式、访问方式和操作方式。
数据结构包括线性结构、树结构、图结构等。
1.2 数据结构的作用和重要性数据结构的作用是提供了一种有效地存储和操作数据的方法,能够更高效地解决问题。
数据结构的重要性体现在以下几个方面:•数据结构是算法的基础,不同的数据结构适用于不同类型的问题和算法。
•数据结构能够提高程序的执行效率,减少资源的浪费。
•数据结构的设计和选择与程序的可维护性和可扩展性有关。
1.3 常见的数据结构类型常见的数据结构类型包括:•数组(Array)•链表(Linked List)•栈(Stack)•队列(Queue)•树(Tree)•图(Graph)•哈希表(Hash Table)•堆(Heap)第二章:算法简介2.1 什么是算法?算法是一系列有序步骤的集合,用于解决特定问题的一种方法或过程。
算法可以被实现为计算机程序。
2.2 算法的特性一个好的算法应该具备以下特性:•正确性:算法能够得出正确的结果。
•可读性:算法的代码可读性好,方便理解和维护。
•效率:算法应该能够以高效的方式解决问题,时间和空间复杂度较低。
•易用性:算法应该易于使用和实现。
2.3 常见的算法类型常见的算法类型包括:•搜索算法(如二分查找、深度优先搜索、广度优先搜索)•排序算法(如冒泡排序、插入排序、选择排序、快速排序、归并排序)•图算法(如最短路径算法、最小生成树算法)•动态规划算法•贪心算法第三章:数据结构与算法实现3.1 数据结构的实现方式数据结构可以通过以下几种方式进行实现:•数组:使用连续的内存空间存储数据。
•链表:通过节点间的指针连接来存储数据。
•栈和队列:使用数组或链表实现。
•堆:使用数组实现的二叉树结构。
•树和图:使用节点和连接来表示。
3.2 算法的实现方式算法可以通过编程语言来实现。
常用的编程语言如C++、Java、Python等都提供了对于数据结构和算法的支持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章栈和队列一、选择题1.对于栈操作数据的原则是(B )。
A.先进先出B.后进先出C.后进后出D.不分顺序2.一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是( B )。
A.不确定B.n-i+1 C.i D.n-i3.有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?( C )A.5 4 3 6 1 2 B.4 5 3 1 2 6 C.3 4 6 5 2 1 D.2 3 4 1 5 6 4.设栈的输入序列是1,2,3,4,则()不可能是其出栈序列。
A.1,2,4,3,B.2,1,3,4,C.1,4,3,2,D.4,3,1,2,E.3,2,1,4,5.某堆栈的输入序列为a, b,c ,d,下面的四个序列中,不可能是它的输出序列的是()。
A.a,c,b,d B.b, c,d,a C.c, d,b, a D.d, c,a,b 6.设有三个元素X,Y,Z顺序进栈(进的过程中允许出栈),下列得不到的出栈排列是( )。
A.XYZ B.YZX C.ZXY D.ZYX 7.输入序列为ABC,可以变为CBA时,经过的栈操作为(B )A.push,pop,push,pop,push,pop B.push,push,push,pop,pop,pop C.push,push,pop,pop,push,pop D.push,pop,push,push,pop,pop8.若一个栈以向量V[1..n]存储,初始栈顶指针top为n+1,则下面x进栈的正确操作是( C )。
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-110.栈在( D )中应用。
A.递归调用B.子程序调用C.表达式求值D.A,B,C11.一个递归算法必须包括( B )。
A.递归部分B.终止条件和递归部分C.迭代部分D.终止条件和迭代部分12.执行完下列语句段后,i值为:()int f(int x){ return ((x>0) ? x* f(x-1):2);}int i ;i =f(f(1));A.2 B.4 C.8 D.无限递归13.表达式a*(b+c)-d的后缀表达式是( B )。
A.abcd*+- B.abc+*d- C.abc*+d- D.-+*abcd14.设计一个判别表达式中左,右括号是否配对出现的算法,采用(D )数据结构最佳。
A.线性表的顺序存储结构B.队列C.线性表的链式存储结构D.栈15.用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队尾结点,则在进行删除操作时( A )。
A.仅修改队头指针B.仅修改队尾指针C.队头、队尾指针都要修改D.队头,队尾指针都可能要修改16.假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为( A )。
A.(rear-front+m)%m B.rear-front+1 C.(front-rear+m)%m D.(rear-front)%m17.循环队列A[0..m-1]存放其元素值,用front和rear分别表示队头和队尾,则当前队列中的元素数是( A )。
A.(rear-front+m)%m B.rear-front+1 C.rear-front-1 D.rear-front 18.循环队列存储在数组A[0..m]中,则入队时的操作为(C )。
A.rear=rear+1 B.rear=(rear+1) mod (m-1)C.rear=(rear+1) mod m D.rear=(rear+1)mod(m+1)19.若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?( B )A.1和5 B.2和4 C.4和2 D.5和1 21.最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是( B )。
A.(rear+1) MOD n=front B.rear=frontC.rear+1=front D.(rear-l) MOD n=front 22.栈和队列的共同点是( C )。
A.都是先进先出B.都是先进后出C.只允许在端点处插入和删除元素D.没有共同点23.栈和队都是( C )A.顺序存储的线性结构B.链式存储的非线性结构C.限制存取点的线性结构D.限制存取点的非线性结构24.设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1则栈S的容量至少应该是( )。
A.6 B.4 C.3 D.2二、填空题1._______是限定仅在表尾进行插入或删除操作的线性表。
2.设有一个空栈,栈顶指针为1000H(十六进制),现有输入序列为1,2,3,4,5,经过PUSH,PUSH,POP,PUSH,POP,PUSH,PUSH之后,输出序列是_______,而栈顶指针值是_______H。
设栈为顺序栈,每个元素占4个字节。
4.在作进栈运算时应先判别栈是否_(1)_;在作退栈运算时应先判别栈是否_(2)_;当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为_(3)_。
6.用S表示入栈操作,X表示出栈操作,若元素入栈的顺序为1234,为了得到1342出栈顺序,相应的S和X的操作串为_______。
7.循环队列的引入,目的是为了克服_______。
8.________又称作先进先出表。
9.已知链队列的头尾指针分别是f和r,则将值x入队的操作序列是_______。
10.区分循环队列的满与空,只有两种方法,它们是______和______。
11.设循环队列用数组A[1..M]表示,队首、队尾指针分别是FRONT和TAIL,判定队满的条件为_______。
12.表达式求值是_______应用的一个典型例子。
13.循环队列用数组A[0..m-1]存放其元素值,已知其头尾指针分别是front和rear ,则当前队列的元素个数是_______。
14.设Q[0..N-1]为循环队列,其头、尾指针分别为P和R,则队Q中当前所含元素个数为_______。
三、应用题1.有5 个元素,其入栈次序为:A,B,C,D,E,在各种可能的出栈次序中,以元素C,D最先出栈(即C第一个且D第二个出栈)的次序有哪几个?5.如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,而改置计数器count用以记录队列中结点的个数。
(1)编写实现队列的三个基本运算:判空、入队、出队(2)队列中能容纳元素的最多个数是多少?参考答案一、选择题1.B2.B3.C4.D5.D6.C7.B8.C9.B 10.D 11.B 12.B 13.B 14.D 15.D 16.A 17.A 18.D 19.B 20.C 21.B 22.C 23.C 24.C二、填空题1、栈2、23 100CH3、0 n+1 top[1]+1=top[2]4、(1)满 (2)空 (3)n (4)栈底 (5)两栈顶指针相邻(即值之差的绝对值为1)5、链式存储结构6、S×SS×S××7、假溢出时大量移动数据元素。
8、队列9、s=(LinkedList)malloc(sizeof(LNode)); s->data=x;s->next=r->next;r->next=s;r=s;10、牺牲一个存储单元设标记11、(TAIL+1)MOD M=FRONT (数组下标0到M-1,若一定使用1到M,则取模为0者,值改取M12、栈 13、(rear-front+m)% m; 14、(R-P+N)% N;三、应用题1、三个:CDEBA,CDBEA,CDBAE2、借助栈结构,n个入栈元素可得到1/(n+1)((2n)!/(n!*n!))种出栈序列。
本题4个元素,可有14种出栈序列,abcd和dcba就是其中两种。
但dabc 和adbc是不可能得到的两种。
5、typedef struct{elemtp q[m];int front,count; //front是队首指针,count是队列中元素个数。
}cqnode; //定义类型标识符。
(1)判空:int Empty(cqnode cq) //cq是cqnode 类型的变量{if(cq.count==0) return(1);else return(0); //空队列} 入队: int EnQueue(cqnode cq,elemtp x){if(count==m){printf(“队满\n”);exit(0); }cq.q[(cq.front+count)%m]=x; //x入队count++; return(1); //队列中元素个数增加1,入队成功。
}出队: int DelQueue(cqnode cq){if (count==0){printf(“队空\n”);return(0);}printf(“出队元素”,cq.q[cq.front]);x=cq.q[cq.front];cq.front=(cq.front+1)%m; //计算新的队头指针。
return(x)}(2) 队列中能容纳的元素的个数为m。
队头指针front指向队头元素。
8、[题目分析]表达式中的括号有以下三对:‘(’、‘)’、‘[’、‘]’、‘{’、‘}’,使用栈,当为左括号时入栈,右括号时,若栈顶是其对应的左括号,则退栈,若不是其对应的左括号,则结论为括号不配对。
当表达式结束,若栈为空,则结论表达式括号配对,否则,结论表达式括号不配对。
int Match(LinkedList la)//算术表达式存储在以la为头结点的单循环链表中,本算法判断括号是否正确配对{char s[]; //s为字符栈,容量足够大p=la->link; //p为工作指针,指向待处理结点StackInit(s); //初始化栈swhile (p!=la) //循环到头结点为止{switch (p->ch){case‘(’:push(s,p->ch); break;case‘)’:if(StackEmpty(s)||StackGetTop(s)!=‘(’){printf(“括号不配对\n”); return(0);} elsepop(s);break;case‘[’:push(s,p->ch); break;case‘]’: if(StackEmpty(s)||StackGetTop(s)!=‘[’){printf(“括号不配对\n”); return(0);} elsepop(s);break;case‘{’:push(s,p->ch); break;case‘}’: if(StackEmpty(s)||StackGetTop(s)!=‘{’){printf(“括号不配对\n”); return(0);} elsepop(s);break;} p=p->link; 后移指针}//whileif (StackEmpty(s)) {printf(“括号配对\n”); return(1);}else{printf(“括号不配对\n”); return(0);}}//算法match结束[算法讨论]算法中对非括号的字符未加讨论。