第三章栈和队列习题答案
数据结构第三章栈和队列习题及答案
习题三栈和队列一单项选择题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,则栈的容量至少应该是()A.2B. 3C. 5D.65. 若栈采用顺序存储方式存储,现两栈共享空间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. 用链接方式存储的队列,在进行删除运算时()。
(完整版)第3章栈与队列习题参考答案
A.1234
B. 1324
C. 4321
D. 1423
3.在链栈中,进行出栈操作时( B )。
A.需要判断栈是否满
B. 需要判断栈是否为空
C. 需要判断栈元素的类型
D. 无需对栈作任何差别
4.在顺序栈中,若栈顶指针 top 指向栈顶元素的下一个存储单元,且顺序栈的最大容量是 maxSize,则顺序栈 的判空条件是( A )。
The shortest way to do many things is
习题三参考答案 备注: 红色字体标明的是与书本内容有改动的内容。
一、选择题
1. 在栈中存取数据的原则是( B )。
A. 先进先出
B. 先进后出
C. 后进后出
D. 没有限制
2.若将整数 1、2、3、4 依次进栈,则不可能得到的出栈序列是( D )。
else if (i==1) if (top1==base1) throw new Exception("第 0 号栈为空"); else x=stackElem[++top1];
The shortest way to do many things is
return x; } } // DuSqStack 类结束 4. 循环顺序队列类采用设置一个计数器的方法来区分循环队列的判空和判满。试分别编写顺序循环队列中入 队和出队操作的函数。 参考答案: //循环顺序队列存储结构类描述如下: class CircleSqQueue_num { private Object[] queueElem; // 队列存储空间 private int front;// 队首的引用,若队列不空,指向队首元素,初值为 0 private int rear;// 队尾的引用,若队列不空,指向队尾元素的下一个位置,初值为 0 private int num; // 计数器用来记录队列中的数据元素个数
数据结构课后习题答案第三章
第三章栈和队列(参考答案)// 从数据结构角度看,栈和队列是操作受限的线性结构,其顺序存储结构// 和链式存储结构的定义与线性表相同,请参考教材,这里不再重复。
3.1 1 2 3 4 2 1 3 4 3 2 1 4 4 3 2 11 2 4 3 2 1 4 3 3 2 4 11 32 4 23 14 3 4 2 11 3 42 234 11 4 32 2 43 1设入栈序列元素数为n,则可能的出栈序列数为C2n n=(1/n+1)*(2n!/(n!)2)3.2 证明:由j<k和p j<p k说明p j在p k之前出栈,即在k未进栈之前p j已出栈,之后k进栈,然后p k出栈;由j<k和p j>p k说明p j在p k之后出栈,即p j被p k压在下面,后进先出。
由以上两条,不可能存在i<j<k使p j<p k<p i。
也就是说,若有1,2,3顺序入栈,不可能有3,1,2的出栈序列。
3.3 void sympthy(linklist *head, stack *s)//判断长为n的字符串是否中心对称{ int i=1; linklist *p=head->next;while (i<=n/2) // 前一半字符进栈{ push(s,p->data); p=p->next; }if (n % 2 !==0) p=p->next;// 奇数个结点时跳过中心结点while (p && p->data==pop(s)) p=p->next;if (p==null) printf(“链表中心对称”);else printf(“链表不是中心对称”);} // 算法结束3.4int match()//从键盘读入算术表达式,本算法判断圆括号是否正确配对(init s;//初始化栈sscanf(“%c”,&ch);while (ch!=’#’) //’#’是表达式输入结束符号switch (ch){ case ’(’: push(s,ch); break;case ’)’: if (empty(s)) {printf(“括号不配对”); exit(0);}pop(s);}if (!empty(s)) printf(“括号不配对”);else printf(“括号配对”);} // 算法结束3.5typedef struct // 两栈共享一向量空间{ ElemType v[m]; // 栈可用空间0—m-1int top[2] // 栈顶指针}twostack;int push(twostack *s,int i, ElemType x)// 两栈共享向量空间,i是0或1,表示两个栈,x是进栈元素,// 本算法是入栈操作{ if (abs(s->top[0] - s->top[1])==1) return(0);// 栈满else {switch (i){case 0: s->v[++(s->top)]=x; break;case 1: s->v[--(s->top)]=x; break;default: printf(“栈编号输入错误”); return(0);}return(1); // 入栈成功}} // 算法结束ElemType pop(twostack *s,int i)// 两栈共享向量空间,i是0或1,表示两个栈,本算法是退栈操作{ ElemType x;if (i!=0 && i!=1) return(0);// 栈编号错误else {switch (i){case 0: if(s->top[0]==-1) return(0);//栈空else x=s->v[s->top--];break;case 1: if(s->top[1]==m) return(0);//栈空else x=s->v[s->top++]; break;default: printf(“栈编号输入错误”);return(0);}return(x); // 退栈成功}} // 算法结束ElemType top (twostack *s,int i)// 两栈共享向量空间,i是0或1,表示两个栈,本算法是取栈顶元素操作{ ElemType x;switch (i){case 0: if(s->top[0]==-1) return(0);//栈空else x=s->v[s->top]; break;case 1: if(s->top[1]==m) return(0);//栈空else x=s->v[s->top]; break;default: printf(“栈编号输入错误”);return(0);}return(x); // 取栈顶元素成功} // 算法结束3.6void Ackerman(int m,int n)// Ackerman 函数的递归算法{ if (m==0) return(n+1);else if (m!=0 && n==0) return(Ackerman(m-1,1);else return(Ackerman(m-1,Ackerman(m,n-1))} // 算法结束3.7(1) linklist *init(linklist *q)// q是以带头结点的循环链表表示的队列的尾指针,本算法将队列置空{ q=(linklist *)malloc(sizeof(linklist));//申请空间,不判断空间溢出q->next=q;return (q);} // 算法结束(2) linklist *enqueue(linklist *q,ElemType x)// q是以带头结点的循环链表表示的队列的尾指针,本算法将元素x入队{ s=(linklist *)malloc(sizeof(linklist));//申请空间,不判断空间溢出s->next=q->next; // 将元素结点s入队列q->next=s;q=s; // 修改队尾指针return (q);} // 算法结束(3) linklist *delqueue(linklist *q)//q是以带头结点的循环链表表示的队列的尾指针,这是出队算法{ if (q==q->next) return (null); // 判断队列是否为空else {linklist *s=q->next->next; // s指向出队元素if (s==q) q=q->next; // 若队列中只一个元素,置空队列else q->next->next=s->next;// 修改队头元素指针free (s); // 释放出队结点}return (q);} // 算法结束。
第3章栈与队列答案
第3章栈和队列3.1栈一、填空题1.线性任何栈顶2.栈顶栈底3.移动栈顶指针存入元素二、选择题1.B2.C3.B4.A5.B6.B7.B8.( 2,4,2)9.(2,1,2,4,3)三、判断题1. ×2. √3. ×4. √5. ×6. √7. √四、简答题1.至少有14种。
①全进之后再出情况,只有1种:4,3,2,1②进3个之后再出的情况,有3种,3,4,2,1 3,2,4,1 3,2,1,4③进2个之后再出的情况,有5种,2,4,3,1 2,3,4,1 2,1, 3,4 2,1,4,3 2,1,3,4④进1个之后再出的情况,有5种,1,4,3,2 1,3,2,4 1,3,4,2 1, 2,3,4 1,2,4,3 2.输出为“stack”。
五、算法设计题1.Status AllBrackets_Test(char *str)//判别表达式中三种括号是否匹配{InitStack(s);for(p=str;*p;p++){if(*p=='('||*p=='['||*p=='{') push(s,*p);else if(*p==')'||*p==']'||*p=='}'){ if(StackEmpty(s)) return ERROR;pop(s,c);if(*p==')'&&c!='(') return ERROR;if(*p==']'&&c!='[') return ERROR;if(*p=='}'&&c!='{') return ERROR; //必须与当前栈顶括号匹配}}//forif(!StackEmpty(s)) return ERROR;return OK;}//AllBrackets_Test2.int Palindrome_Test(){ //判别输入的字符串是否回文序列,是则返回1,否则返回0 InitStack(S);InitQueue(Q);while((c=getchar())!='@') {Push(S,c);EnQueue(Q,c); //同时使用栈和队列两种结构}while(!StackEmpty(S)){Pop(S,a);DeQueue(Q,b));if(a!=b) return ERROR;}return OK;}//Palindrome_Test3.2队列一、填空题1.队尾队首2. 队列3.n-14.队列的假溢出5.先进先出二、选择题1. B2. D3.B4.D5.(1,2,2)6.A7.B三、判断题1. ×2. √3. ×4. √5. ×6. ×7. √ 8 √四、简答题1.用队列长度计算公式: (N+r-f)% N① L=(40+19-11)% 40=8 ② L=(40+11-19)% 40=322.一般的一维数组队列的尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出”。
栈和队列习题及答案
栈和队列习题及答案第三章栈和队列⼀、选择题1、⼀个栈的输⼊序列为:a,b,c,d,e,则栈的不可能输出的序列是()。
A. a,b,c,d,eB. d,e,c,b,aC. d,c,e,a,bD. e,d,c,b,a2、判断⼀个循环队列Q(最多n个元素)为满的条件是()。
A. Q->rear==Q->frontB. Q->rear==Q->front+1C. Q->front==(Q->rear+1)%nD. Q->front==(Q->rear-1)%n3、设计⼀个判别表达式中括号是否配对的算法,采⽤()数据结构最佳。
A. 顺序表B. 链表C. 队列D. 栈4、带头结点的单链表head为空的判定条件是()。
A. head==NULLB. head->next==NULLC. head->next!=NULLD. head!=NULL5、⼀个栈的输⼊序列为:1,2,3,4,则栈的不可能输出的序列是()。
A. 1243B. 2134C. 1432D. 4312E. 32146、若⽤⼀个⼤⼩为6的数组来实现循环队列,且当rear和front的值分别为0,3。
当从队列中删除⼀个元素,再加⼊两个元素后,rear和front 的值分别为()。
A. 1和5B. 2和4C. 4和2D. 5和17、队列的插⼊操作是在()。
A. 队尾B. 队头C. 队列任意位置D. 队头元素后8、循环队列的队头和队尾指针分别为front和rear,则判断循环队列为空的条件是()。
A. front==rearB. front==0C. rear==0D. front=rear+19、⼀个顺序栈S,其栈顶指针为top,则将元素e⼊栈的操作是()。
A. *S->top=e;S->top++;B. S->top++;*S->top=e;C. *S->top=eD. S->top=e;10、表达式a*(b+c)-d的后缀表达式是()。
数据结构第三章栈和队列练习及答案
一、选择题一、选择题1、栈中存取数据的原则()、栈中存取数据的原则()A 、先进先出B 、先进后出C 、后进后出D 、随意进出、随意进出2、队列中存取数据的原则()、队列中存取数据的原则() A 、先进先出 B 、后进先出 C 、先进后出 D 、随意进出、随意进出3、插入和删除只能在一端进行的线性表,称为()、插入和删除只能在一端进行的线性表,称为()A 、队列B 、循环队列C 、栈D 、循环栈、循环栈4、在栈中,出栈操作的时间复杂度为()、在栈中,出栈操作的时间复杂度为()A 、O (1)B 、O (log 2n )C 、O (n )D 、O (n 2)5、设长度为n 的链队列用单循环链表表示,若只设头指针,则入队操作的时间复杂度为的链队列用单循环链表表示,若只设头指针,则入队操作的时间复杂度为()() A 、O (1) B 、O (log 2n ) C 、O (n ) D 、O (n 2)6、设长度为n 的链队列用单循环链表表示,若只设头指针,则出队操作的时间复杂度为的链队列用单循环链表表示,若只设头指针,则出队操作的时间复杂度为()() A 、O (1) B 、O (log 2n ) C 、O (n ) D 、O (n 2)7、一个线性表的第一个元素的存储地址是100,每个元素的长度是2,则第5个元素的地址是()是() A 、110 B 、108 C 、100 D 、1208、一个栈的入栈序列是a,b,c,d,e ,则栈的不可能的输出序列是(),则栈的不可能的输出序列是()A 、edcbaB 、decbaC 、dceabD 、abcde9、若已知一个栈的入栈序列是1,2,3,……,n ,其输出序列是p1,p2,p3,……,pn ,若p1=n ,则pi 为()为()A 、iB 、n=iC 、n-i+1D 、不确定、不确定10、判断一个栈ST (最多元素m0)为空的条件是())为空的条件是()A 、ST->top==0B 、ST->top==-1C 、ST->top!=m0D 、ST->top==m0 11、判断一个栈ST (最多元素m0)为满的条件是())为满的条件是()A 、ST->top!=0B 、ST->top==0C 、ST->top!=m0D 、ST->top==m0 12、判断一个循环队列QU (最多元素为m0)为空的条件是())为空的条件是() A 、QU.front==QU.rear B 、QU.front!=QU.rearC 、QU.front==(QU.rear+1)%m0D 、QU.front!=(QU.rear+1)%m013、判断一个循环队列QU (最多元素为m0)为满的条件是())为满的条件是()A 、QU.front==QU.rearB 、QU.front!=QU.rearC 、QU.front==(QU.rear+1)%m0D 、QU.front!=(QU.rear+1)%m0 14、循环队列用数组存放其元素值A[0,m-1],已知其头尾指针分别是rear 和front ,则当前队列的元素个数是()队列的元素个数是()A 、(rear-front+m)%mB 、rear-front+1C 、rear-front-1D 、rear-front 15、栈和队列的共同特点是()、栈和队列的共同特点是()A 、都是先进后出B 、都是先进先出、都是先进先出C 、只允许在端点处插入和删除D 、没有共同点、没有共同点二、填空题二、填空题1、设长度为n 的链队列用单循环链表表示,若只设头指针,则入队和出队操作的时间复杂度分别为(O(N))和(O(1));若又设尾指针,则入队和出队操作的时间复杂度分别为(O(1))和(O(1))。
数据结构第三章 栈和队列题库(30道)
数据结构第三章栈和队列1、栈的“先进后出”特性是指(——[单选题]A 最后进栈的元素总是最先出栈B 当同时进行进栈和出栈操作时,总是进栈优先C 每当有出栈操作时,总要先进行一次进栈操作D 每次出栈的元素总是最先进栈的元素正确答案:A2、设一个栈的进栈序列是A、B、C、D(即元素A~D依次通过该栈),则借助该栈所得到的输出序列不可能是( )。
——[单选题]A A,B,C,DB D,C,B,AC A,C,D,BD D,A,B,C正确答案:D3、一个栈的进栈序列是a、b、c、d、e,则栈的不可能的输出序列是( )。
——[单选题]A edcbaB decbaC dceabD abcde正确答案:C4、已知一个栈的进栈序列是1,2,3,…,n,其输出序列的第一个元素是i(1≤i≤n)则第j(1≤j≤n)个出栈元素是( )。
——[单选题]A iB n-iC j-i+1D 不确定正确答案:D5、设顺序栈st的栈顶指针top的初始时为-1,栈空间大小为MaxSize,则判定st栈为栈空的条件为( )。
——[单选题]A st.top==-1B st.top!=-1C st.top!=MaxSizeD st.top==MaxSize6、设顺序栈st的栈顶指针top的初始时为-1,栈空间大小为MaxSize,则判定st栈为栈满的条件是。
——[单选题]A st.top!=-1B st.top==-1C st.top!=MaxSize-1D st.top==MaxSize-1正确答案:D7、当用一个数组data[0..n- 1]存放栈中元素时,栈底最好(——[单选题]A 设置在data[0]处B 设置在data[n- 1]处C 设置在data[0]或data[n- 1]处D 设置在data数组的任何位置正确答案:C8、若一个栈用数组data[1..n]存储,初始栈顶指针top为0,则以下元素x进栈的正确操作是(——[单选题]A top++; data[top]=x;B data[top]=x; top++;C Top--; data[top]=x;D data[top]=x; top--;正确答案:A9、若一个栈用数组data[1..n]存储,初始栈顶指针top为n,则以下元素I进栈的正确操作是(——[单选题]A top++; data[top]= x;B data[top]=x; top++ ;C top--; data top]=x;D data[top]=x; top--;正确答案:D10、队列中元素的进出原则是( )。
第3章栈和队列习题参考答案
第3章栈和队列习题参考答案第3章栈和队列一、基础知识题3.1有五个数依次进栈:1,2,3,4,5。
在各种出栈的序列中,以3,4先出的序列有哪几个。
(3在4之前出栈)。
【解答】34215 ,34251,345213.2铁路进行列车调度时,常把站台设计成栈式结构,若进站的六辆列车顺序为:1,2,3,4,5,6,那么是否能够得到435612,325641,154623和135426的出站序列,如果不能,说明为什么不能;如果能,说明如何得到(即写出"进栈"或"出栈"的序列)。
【解答】输入序列为123456,不能得出435612和154623。
不能得到435612的理由是,输出序列最后两元素是12,前面4个元素(4356)得到后,栈中元素剩12,且2在栈顶,不可能让栈底元素1在栈顶元素2之前出栈。
不能得到154623的理由类似,当栈中元素只剩23,且3在栈顶,2不可能先于3出栈。
得到325641的过程如下:1 2 3顺序入栈,32出栈,得到部分输出序列32;然后45入栈,5出栈,部分输出序列变为325;接着6入栈并退栈,部分输出序列变为3256;最后41退栈,得最终结果325641。
得到135426的过程如下:1入栈并出栈,得到部分输出序列1;然后2和3入栈,3出栈,部分输出序列变为13;接着4和5入栈,5,4和2依次出栈,部分输出序列变为13542;最后6入栈并退栈,得最终结果135426。
3.3若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?【解答】2和43.4设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e3,e5,e4,e6,e2,e1,则栈S的容量至少应该是多少?【解答】43.5循环队列的优点是什么,如何判断“空”和“满”。
栈和队列课后习题答案
第三章栈和队列课后习题答案1、单项选择题(1) B(2) B(3) D(4) D(5) C(6) C(7) B(8) C(9) B(10)C2、填空题(1)后进先出先进先出(2)front = rear (rear+1)% Max = front(3)top = 0 top =N-1(4)空空只含有一个结点(5)p->next=top; top=p;(6)rear->next=p; rear=p;(7) 4(8)假上溢3、问答题(1)参考答案:栈的操作特点是后进先出,因此输出序列有:A入,A出,B入,B出,C入C出,输出序列为ABC。
A入,A出,B入,C入,C出,B出,输出序列为ACB。
A入,B入,B出,A出,C入,C出,输出序列为BAC。
A入,B入,B出,C入,C出,A出,输出序列为BCA。
A入,B入,C入,C出,B出,A出,输出序列为CBA。
(2)参考答案:8 3 5 + 5 6 2 / - * -(3)参考答案:一个过程(或函数)直接或间接调用自己,这种过程(或函数)叫递归过程(或函数)。
递归算法一般用于解决三类问题:1)数据的定义是按递归定义的。
(Fibonacci函数)2)问题解法按递归算法实现。
(回溯)3)数据的结构形式是按递归定义的。
(树的遍历,图的搜索)设计递归算法的方法:①寻找递归通式,分解问题;②设置递归出口,确定递归终止条件。
(4)参考答案:向一个顺序栈插入一个元素时,首先使栈顶指针后移一个位置,然后把待插入元素写入到这个位置上。
(5)参考答案:向一个链栈插入一个新结点时,首先把栈顶指针的值赋给新结点的指针域,然后把新结点的存储位置赋给栈顶指针。
(6)参考答案:①一种是在定义结构体时,附设一个存储循环队列中元素个数的变量如n,当n=0时,队空。
当n=MaxSize时为队满。
②另一种方法是少用一个元素控件,约定当尾指针加1等于头指针时,认为是队满,可用于求模运算来实现,即front=rear,称为队空。
数据结构 栈与队列升本习题答案
第三章栈与队列(答案)一、选择题1.栈的特点是( B ),队列的特点是( A )。
A、先进先出B、后进先出2.一个栈的队列顺序是a,b,c,d,e,则栈的不可能的输出序列是()。
A 、edcba B、decba C、dceab D 、abcde3. 判断一个队列QU(最多元素为MAXSIZE)为空的条件是()A 、QU->rear-QU->front== MAXSIZE B、QU->rear-QU->front-1==MAXSIZEC、QU->front==QU->rearD、QU->front==QU->rear+14.若已知一个栈的进栈序列是1,2,3,……..,n,其输出序列为p1,p2,p3,…..,pn,若p1=n,则pi(1<=i<n)为()A、i B 、n=i C、n-i+1 D、不确定5.循环顺序队列中是否可以插入下一个元素,()A、与队首指针和队尾指针的值有关B、只与队尾指针的值有关,与队首指针的值无关C、只与数组大小有关,与队首指针和队尾指针的值无关D、与曾经进行过多少次插入操作有关二、填空题1. 设有编号为1,2,3,4的四辆车,顺序进入一个栈式结构的站台(栈的大小为4),试写出这四辆车开出站的所有可能的顺序(每辆车入站后出站的时间未知):1234,1243,1324,1342,1432,2134,2143,2314,2341,2431,3214,3241,3421,43212.将下列各中缀表达式转换成后缀表达式。
(A*(B+C)+D)*E-F*G ABC+*D+E*FG*- ;A*(B-D)+H/(D+E)-S/N*T ABD-*HDE+/+SN/T*- ;(A-C)*(B+D)+(E-F)/(G+H) AC-BD+*EF-GH+/+3.顺序栈的入栈操作Sqstack *push_seqstack(Sqstack *s,elementtype x){ if(s->top= =MAXLEN-1){ printf(“上溢\n”);return 0;}else{ s->top++;s->element[s->top] =x;return s;}}4.链栈的出栈操作int *pop_linkstack(linkstack *s,elementtype y) {linkstack *p;if(s==NULL ){ printf(“下溢\n”);return 0;}else{ p=s;y=s->data;s= s->next ;(或者s=p->next)free(p);return 1;}}5.循环队列的出队操作elementtype delete_cyqueue(Cqueue *cp,elementtype y) { if( cp->front= =cp->rear ){ printf(“下溢\n”);return NULL;}else{ cp->front= (cp->font+1)%MAXLEN ;y=cp->element[cp->front];return y;} }。
第三章-栈和队列习题答案Word版
第三章栈和队列习题答案一、基础知识题3.1 设将整数1,2,3,4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下述问题:(1)若入、出栈次序为Push(1), Pop(),Push(2),Push(3), Pop(), Pop( ),Push(4), Pop( ),则出栈的数字序列为何(这里Push(i)表示i进栈,Pop( )表示出栈)?(2)能否得到出栈序列1423和1432?并说明为什么不能得到或者如何得到。
(3)请分析 1,2 ,3 ,4 的24种排列中,哪些序列是可以通过相应的入出栈操作得到的。
答:(1)出栈序列为:1324(2)不能得到1423序列。
因为要得到14的出栈序列,则应做Push(1),Pop(),Push(2),Push (3),Push(4),Pop()。
这样,3在栈顶,2在栈底,所以不能得到23的出栈序列。
能得到1432的出栈序列。
具体操作为:Push(1), Pop(),Push(2),Push(3),Push(4),Pop(),Pop(),Pop()。
(3)在1,2 ,3 ,4 的24种排列中,可通过相应入出栈操作得到的序列是:1234,1243,1324,1342,1432,2134,2143,2314,2341,2431,3214,3241,3421,4321不能得到的序列是:1423,2413,3124,3142,3412,4123,4132,4213,4231,43123.2 链栈中为何不设置头结点?答:链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。
3.3 循环队列的优点是什么? 如何判别它的空和满?答:循环队列的优点是:它可以克服顺序队列的"假上溢"现象,能够使存储队列的向量空间得到充分的利用。
判别循环队列的"空"或"满"不能以头尾指针是否相等来确定,一般是通过以下几种方法:一是另设一布尔变量来区别队列的空和满。
第三章+栈和队列(参考答案)
第三章栈和队列一、判断题1、链栈的初始化是指开辟足够多的结点,然后置栈顶指针为 NULL。
(×)2、递归定义的数据结构通常不需要用递归的算法来实现对它的操作。
(×)二、填空题1、向一个链式栈插入一个新结点时,首先把栈顶指针的值赋给新结点的指针域,然后把新结点的存储位置赋给___栈顶指针_____。
2、迷宫问题是一个回溯控制的问题,最好使用____栈______的方法来解决。
3、有如下递归过程:Void Print(int w){int i;if (w!=0){Print(w−1);for (i=1;i<=w;i++) printf(“%3d”,w);printf(“\n”);}}调用语句print(4)的结果是__________。
12 23 3 34 4 4 44、假设用循环单链表实现队列,若队列非空,且队尾指针为R, 则将新结点S加入队列时,需执行下面语句:_ S->next=R->next _________;___ R->next=S _______;R=S;三、选择题1、设有4个数据元素a1、a2、a3和a4,对他们分别进行栈操作或队操作。
在进栈或进队操作时,按a1、a2、a3、a4次序每次进入一个元素。
假设栈或队的初始状态都是空。
现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时,第一次出栈得到的元素是 A 2,第二次出栈得到的元素是 B 4;类似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;这时,第一次出队得到的元素是 C 1,第二次出队得到的元素是 D 2。
经操作后,最后在栈中或队中的元素还有 E 2个。
供选择的答案:A~D:①a1 ②a2 ③ a3 ④a4E:①1 ②2 ③ 3 ④ 02、栈是一种线性表,它的特点是 A 2。
设用一维数组A[1,…,n]来表示一个栈,A[n]为栈底,用整型变量T指示当前栈顶位置,A[T]为栈顶元素。
第三章栈和队列练习题答案
第三章栈和队列练习题答案一、名词说明:1.栈、栈顶、栈底、栈顶元素、空栈2.顺序栈3.链栈4.递归5.队列、队尾、队头6.顺序队7.循环队8.队满9.链队10.随机存储结构11.特殊矩阵12.稀疏矩阵13.对称方阵14.上(下)三角矩阵二、填空题:1.栈修改的原那么是_先进后出________或称后进先出________,因此,栈又称为__后进先出______线性表。
在栈顶进行插入运算,被称为_进栈_______或__入栈______,在栈顶进行删除运算,被称为___退栈_____或__出栈______。
2.栈的大体运算至少应包括_初始化InitStack(S)_______、_进栈Push(S,X)_______、_退栈Pop(S)_______、读栈顶Top(S)________、_判栈空Empty(S)_______五种。
3.关于顺序栈,假设栈顶下标值top=0,现在,若是作退栈运算,那么产生“__下溢______”。
4.关于顺序栈而言,在栈满状态下,若是现在在作进栈运算,那么会发生“_上溢_______”。
5.一样地,栈和线性表类似有两种实现方式,即__顺序______实现和__链接实现。
6. top=0表示栈空,现在作退栈运算,那么产生“下溢”;top=sqstack_maxsize-1表示栈满,现在作进栈运算,那么产生“上溢”。
7.以下运算实此刻顺序栈上的初始化,请在________处用适当的句子予以填充。
int InitStack(SqStackTp *sq){ sq->top=0;return(1);}8.以下运算实此刻顺序栈上的进栈,请在________处用适当的语句予以填充。
Int Push(SqStackTp *sq,DataType x){ if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);}else{_ sq->top++,sq->data[sq->top] =x;return(1);}}9.以下运算实此刻顺序栈上的退栈,请在________________用适当句子予以填充。
第3章 栈与队列习题参考答案
习题三参考答案备注: 红色字体标明的是与书本内容有改动的内容。
一、选择题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 )。
栈和队列练习题答案
第3章栈和队列练习题答案一、填空题1. 线性表、栈和队列都是线性结构,可以在线性表的任何位置插入和删除元素;对于栈只能在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。
2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。
不允许插入和删除运算的一端称为栈底。
3. 队列是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
二、判断正误(√)1. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。
(√)2. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。
正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
(×)3. 栈和队列是一种非线性数据结构。
错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
(√)4. 栈和队列的存储方式既可是顺序方式,也可是链接方式。
(√)5. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。
(×)6. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。
错,后半句不对。
(×)7. 一个栈的输入序列是12345,则栈的输出序列不可能是12345。
错,有可能。
三、单项选择题(B)1.栈中元素的进出原则是A.先进先出B.后进先出C.栈空则进D.栈满则出(C)2.若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为A.iB.n-iC.n-i+1D.不确定解释:当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)% nE:①1 ②2 ③3 ④0四、阅读理解1.【严题集3.3②】写出下列程序段的输出结果(栈的元素类型SElem Type为char)。
第3章队列和栈习题参考答案[4页]
一、选择题1. A2. C3. B4. B5. A6. B7. C8. C9. B10. D11. B12. D13. B14. D15. A16. B17. D18. C19. C20. B21. B二、填空题1. 队列2. FILO FIFO3. 栈顶栈底4. 前一个位置;n-15. 尾首6. 队尾队头7. 线性表后进先出表8. s->next=h->next h=s9. q->front->next=NULLq->rear=q->front;10. stack三、判断题1. ×2. √3. √4. ×5. √6. √7. √8. √9. ×10. ×四、简答题1. 顺序队列的结构:typedef struct{datatype data[maxsize]int front rear;}sequeue;sequeue *sq;2. 解答:链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点3. (1)出栈序列为:1324(2)不能得到1423序列。
因为要得到14的出栈序列,则应做Push(1),Pop(),Push(2),Push(3),Push(4),Pop()。
这样,3在栈顶,2在栈底,所以不能得到23的出栈序列。
能得到1432的出栈序列。
具体操作为:Push(1), Pop(),Push(2),Push(3),Push(4),Pop(),Pop(),Pop()。
4. 用队列长度计算公式:(N+r-f)% N① L=(40+19-11)% 40=8 ② L=(40+11-19)% 40=325. 答:该算法的功能是:利用堆栈做辅助,将队列中的数据元素进行逆置。
6. 栈是仅允许在一端进行插入和删除的线性表,又称为后进先出表, 队列是允许在一端插入,在另一端删除的线性表,允许插入的一端的称为队尾,允许删除的一端称为队头,又称为先进先出表。
第三章 栈与队列习题答案
第三章栈与队列习题答案一、基础知识题3、1 设将整数1,2,3,4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下述问题:(1)若入、出栈次序为Push(1), Pop(),Push(2),Push(3), Pop(), Pop( ),Push(4), Pop( ),则出栈得数字序列为何(这里Push(i)表示i进栈,Pop( )表示出栈)?(2)能否得到出栈序列1423与1432?并说明为什么不能得到或者如何得到。
(3)请分析1,2 ,3 ,4 得24种排列中,哪些序列就是可以通过相应得入出栈操作得到得。
答:(1)出栈序列为:1324(2)不能得到1423序列。
因为要得到14得出栈序列,则应做Push(1),Pop(),Push(2),Push (3),Push(4),Pop()。
这样,3在栈顶,2在栈底,所以不能得到23得出栈序列。
能得到1432得出栈序列。
具体操作为:Push(1), Pop(),Push(2),Push(3),Push(4),Pop(),Pop(),Pop()。
(3)在1,2 ,3 ,4 得24种排列中,可通过相应入出栈操作得到得序列就是:1234,1243,1324,1342,1432,2134,2143,2314,2341,2431,3214,3241,3421,4321不能得到得序列就是:1423,2413,3124,3142,3412,4123,4132,4213,4231,43123、2 链栈中为何不设置头结点?答:链栈不需要在头部附加头结点,因为栈都就是在头部进行操作得,如果加了头结点,等于要对头结点之后得结点进行操作,反而使算法更复杂,所以只要有链表得头指针就可以了。
3、3 循环队列得优点就是什么? 如何判别它得空与满?答:循环队列得优点就是:它可以克服顺序队列得"假上溢"现象,能够使存储队列得向量空间得到充分得利用。
第3章-栈和队列_参考答案
第3章 栈和队列一、选择题1~5 BBDAA 6~10 CACAC11~15 ABBAA 11~19 BBAB二、填空题1.栈顶 栈顶指针2.63.n-14. 栈顶 栈底5.队尾 对头6.s->top=-1 s->top+17. 栈顶三、综合题1.Sina2.23 50 453. 假设称正读和反读都相同的字符序列为“回文”,例如:"abba"和"abcba"是回文,"abcde"和"ababab"则不是回文。
试写一个算法判别读入的一个以'@'为结束符的字符序列是否是回文1. 【解答1】int palindrome ( char A[ ], int n ){ Sqstack st;st.top=-1int yes = 1, i = 0;while ( A[i] != ‘\0’ ) { Push ( A[i] ); i++; } //扫描字符串,所有字符进栈i = 0;while ( A[i] != ‘\0’ ) //比较字符串if ( A[i] == GetTop ( ) ) { Pop ( ); i++; }else { yes = 0; break; }return yes;}【解答2】采用递归算法,判断从s到e中的字符串是否回文,通过函数返回是或不是。
int palindrome ( char A[ ], int s, int e ) {if ( A[s] != A[e] ) return 0;else if ( s > e ) return 1;else palindrome ( A, s+1, e-1 );}4.如下图所示,设有两个栈s1和s2共亨同一数组存储空间stack[1..m],其中栈s1的栈底设在stack[1]处,而栈s2的栈底设在stack[m]处,请编写栈s1和s2的进栈操作push(i,x)和退栈操作pop(i),其中i=1、2,分别表示栈s1和s2。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return OVERFLOW; if(i==0) x=*--tws.top[0]; else if(i==1) x=*++tws.top[1];}
else return ERROR;
return OK;
} //pop
5
2、试写一个算法,识别依次读入的一个以 @为结束符的字符序列是否为形如: 序列1&序列2 模式的字符序列。其中序列1和序列2都不含 字符&,且序列2是序列1的逆序列。
9
typedef char ElemType;
Status AllBrackets_Test(Sqlist L){
//判别表达式中三种括号是否匹配
ElemType *p; InitStack(s);
for(p=L.elem; p<p+L.length; p++)
if(*p==‘(’||*p==‘[’||*p==‘{’) push(s,*p); else if(*p==‘)’||*p==‘]’||*p==‘}’){
Push(S,c);EnQueue(Q,c); }
//同时使用栈和队列两种结构
while(!StackEmpty(S)) { Pop(S,a); DeQueue(Q,b)); if(a!=b) return FALSE; }
return TRUE; } //Palindrome_Test
20
Status Palindrome_Test( ){
return OK; }
13
Status DeCiQueue(CiLQueue &Q, int &x){ //出队:从循环链表表示的队列Q头部删除元素x
if(Q==Q->next) return ERROR; //队列空
p=Q->next->next; x=p->data; Q->next->next=p->next;
if(StackEmpty(s)) return ERROR;
pop(s,c);
if(*p==‘)’&&c!=‘(’ ) return ERROR; if(*p==‘]’&&c!=‘[’ ) return ERROR; if(*p=='}'&&c!='{‘ ) return ERROR;
} //必须与当前栈顶括号匹配
} //Palindrome_Test
21
*7、试利用循环队列编写求k阶斐波那契序列 中前n+1项(f0,f1,···,fn)算法。要求满足: fn≤max而fn+1>max,其中max为某个约定的常 数。(注意:本题所用循环队列的容量设为k, 在算法执行结束时,留在循环队列中的元素 应是所求k阶斐波那契序列的最后k项fn-k+1, fnk+2, ···, fn )
pop(s,c);
if(e!=c) return FALSE;}
if(!StackEmpty(s)) return FALSE;
return TRUR;
} //IsReverse
7
Status IsReverse( )
//判断输入的字符串中‘&’前和‘&’后部分 是否为逆串,是则返回TRUR,否则返回FALSE
{ InitStack(s);
while((e=getchar( ))!=‘&’ && e!=‘@’)
push(s,e);
while((e=getchar( ))!=‘@’){
if(StackEmpty(s)) return FALSE;
pop(s,c);
if(e!=c) return FALSE;}
tws.stacksize=STACKSIZE; return OK;
} //Init_Stack
3
Status push(DStack &tws, int i, Elemtype x){
//x入栈, i=0表示低端栈, i=1表示高端栈
if(tws.top[0]>tws.top[1])
return OVERFLOW;
if(!StackEmpty(s)) return FALSE;
return TRUR;
} //IsReverse
8
3、假设一个算术表达式中可以包含3种括号: 圆括号‘(’和‘)’,方括号 ‘[’和‘]’ ,花括号 ‘{’和‘}’,且这3 种括号可按任意的次序嵌 套使用。编写判别给定表达式中所含括号是否 正确配对出现的算法(已知表达式已存入数据 元素为字符的顺序表中)。
} //for
if(!StackEmpty(s)) return ERROR;
return OK; } //AllBrackets_Test
10
4、假设以带头结点的循环链表表示队列,并 且只设一个指针指向队尾元素结点(注意不 设头指针),试编写相应的队列初始化、入 队列和出队列的算法。
11
typedef struct QNode { Elemype data; struct QNode *next;
for(i=0;i<k;i++) printf("%d ",Q.base[i]);//输出前k项值 i=k;s1=1; //从第k+1项开始计算
while(s1<max)
{printf("%u ",s1);
m=i%k; Q.base[m]=s1; //值存入队列中并取代已无用的第一项
sum=0;
for(j=0;j<k;j++) sum+=Q.base[(m+j)%k];
18
6、假设称正读和反读都相同的字符序列为 “回文”。试写一个算法判别读入的一个以 ‘@’为结束符的字符序列是否“回文”。
19
Status Palindrome_Test( ){
//判别输入的字符串是否回文,是则返回TRUE,否则返 回FALSE
InitStack(S);InitQueue(Q); //初始化栈S和队列Q while((c=getchar( )!='@'){
第三章 栈和队列
1
1、假设以顺序存储结构实现一个双向栈,即在一组
连续的存储空间中存在两个栈,它们的栈底分别设在 该连续空间两端。试编写实现该双向栈tws的3个操作: 初始化IniStack(tws)、入栈(Push(tws, i, x)和出栈 Pop(tws, i)的算法,其中i为0或1,用以指示设在存储 空间两端的两个栈。
# define STACKSIZE 100
typedef struct{ Elemtype *base[2]; //两个栈底位置 Elemtype *top[2]; // 栈顶指针
int stacksize; //当前已分配的存储空间
} DStack; //双向栈类型
2
Status Init_Stack(DStack &tws){
s1=sum; i++; //求第i项的值 ,置下一个i值
}
} /*GetFib_CyQueue*/
23
typedef struct { int rear; //队尾指针 int lengty; //队列的长度(元素个数) ElemeType base[MAXQSIZE]; //队列元素数 组开始地址
}CyQueue; 16
Status EnCyQueue(CyQueue &Q, int x){ //带length域的循环队列入队算法 if( Q.length==MAXQSIZE ) return OVERFLOW; Q.rear=(Q.rear+1)%MAXQSIZE; Q.base[Q.rear]=x; Q.length++; return OK;
//注意此时的栈满条件
if(i==0) *tws.top[0]++=x; else if(i==1) *tws.top[1]--=x; else return ERROR; return OK;
} //push 4
Status pop(DStack &tws, int i, Elemtype &x) //x出栈, i=0表示低端栈,i=1表示高端栈 {
//判别输入的字符串是否回文,是则返回TRUE,否则返 回FALSE
InitStack(S);InitQueue(Q); //初始化栈S和队列Q while((c=getchar( )!='@'){
Push(S,c);EnQueue(Q,c); }
//同时使用栈和队列两种结构
while(!StackEmpty(S)) { Pop(S,a); DeQueue(Q,b)); if(a==b) return TRUE; }
//初始化一个双向栈tws
tws.base[0]
=(Elemtype*)malloc(STACKSIZE*
sizeof(Elemtype)); tws.base[1]=tws.base[0]+STACKSIZE; tws.top[0]=tws.base[0]; tws.top[1]=tws.base[1];
12
Status EnCiQueue(CiLQueue &Q, ElemType x){ //进队:把元素x插入循环链表表示的队列Q,Q指向队 尾元素,Q->next指向头结点,Q->next->next指向队 首元素
p=(CiLNode*)malloc(sizeof(CiLNode));