数据结构第三章习题课
最新数据结构习题课3讲解学习
0 50 1 10 3 -30 1 20 3 -60 35
a[0] 0 0 50 a[1] 1 0 10 a[2] 1 2 20 a[3] 3 0 -30 a[4] 3 2 -60 a[5] 3 3 5
03 10 22 31
num
00 13 23 35
pos
0
TP3[处理三元组表]
3
FOR i ← 0 TO t-1 DO
20
A[4] 3
2
-60
A[5] 3 3
5
B[4] 2
3
-60
B[5] 3 3
5
算法的关键是求出A中元素在B中的位置
Bnubmer = 0
FOR i=0 TO Cols(A) DO
FOR j=0 TO t DO
IF col(A[j])=i Then
(row(B[Bnumber])=i
col(B[Bnumber])=row(A[j])
算法: TRANSPOSE(A. B)
TP1[初始化] /*声明A的转置矩阵B,使得B的行数等于 A的列数,B的列数等于A的行数,B中非 0元素的个数等于A中非0元素的个数*/ n←Rows(B)←Cols(A). Cols (B)←Rows(A). t←Count(B)← Count(A).
TP2
row(B[k]) ←col(A[i]).
val(B[k]) ← val(A[i]).
pos[p]← pos[p]+1 ).
a[0] 0 0 50 a[1] 1 0 10 a[2] 1 2 20 a[3] 3 0 -30 a[4] 3 2 -60 a[5] 3 3 5
0 0 50 0 1 10
2 1 20
数据结构第三章习题答案解析
第三章习题1.按图3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答:⑴如进站的车厢序列为123,则可能得到的出站车厢序列是什么?⑵如进站的车厢序列为123456,能否得到435612和135426的出站序列,并说明原因。
(即写出以“S”表示进栈、以“X”表示出栈的栈操作序列)。
2.设队列中有A、B、C、D、E这5个元素,其中队首元素为A。
如果对这个队列重复执行下列4步操作:(1)输出队首元素;(2)把队首元素值插入到队尾;(3)删除队首元素;(4)再次删除队首元素。
直到队列成为空队列为止,得到输出序列:(1)A、C、E、C、C (2) A、C、E(3) A、C、E、C、C、C (4) A、C、E、C3.给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满?4.按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程:A-B*C/D+E↑F5.试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1& 序列2’模式的字符序列。
其中序列1和序列2中都不含字符’&’,且序列2是序列1的逆序列。
例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。
6.假设表达式由单字母变量和双目四则运算算符构成。
试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。
7.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。
8.要求循环队列不损失一个空间全部都能得到利用, 设置一个标志域tag , 以tag为0或1来区分头尾指针相同时的队列状态的空与满,请编写与此结构相应的入队与出队算法。
9.简述以下算法的功能(其中栈和队列的元素类型均为int):(1)void proc_1(Stack S){ int i, n, A[255];n=0;while(!EmptyStack(S)){n++; Pop(&S, &A[n]);}for(i=1; i<=n; i++)Push(&S, A[i]);}(2)void proc_2(Stack S, int e) { Stack T; int d;InitStack(&T);while(!EmptyStack(S)){ Pop(&S, &d);if (d!=e) Push( &T, d);}while(!EmptyStack(T)){ Pop(&T, &d);Push( &S, d);}}(3)void proc_3(Queue *Q){ Stack S; int d;InitStack(&S);while(!EmptyQueue(*Q)){DeleteQueue(Q, &d);Push( &S, d);}while(!EmptyStack(S)){ Pop(&S, &d);EnterQueue(Q,d)}}实习题1.回文判断。
数据结构第三章栈和队列习题及答案
习题三栈和队列一单项选择题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. 用链接方式存储的队列,在进行删除运算时()。
数据结构(C语言版)第三章习题解答
第三章习题解答1.分别写出对链栈的入栈和出栈操作的算法。
链栈的结点类型定义如下:Typedef struct stacknode {SElemtype data;struct stacknode *next;}stacknode, *linkstack;入栈操作:Status push( linkstack &S, SElemtype e){ p=(linkstack)malloc(sizeof(stacknode));If (!p) return ERROR;p->data=e;p->next=S;S=p;return OK;}出栈操作:Status pop(linkstack &S, SElemtype &e){ if (!S) return ERROR;p=s;s=p->next;free(p);return OK;}P24/3.15假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。
试编写实现这个双向栈tws的三个操作:初始化inistack(tws),入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i为0或1,用以分别指示设在数组两端的两个栈,并讨论按过程(正/误状态变量可设为变参)或函数设计这些操作算法各有什么优缺点。
双栈的结构类型定义如下:typedef struct{Elemtype *base[2];Elemtype *top[2];}BDStacktype; //双向栈类型栈的初始化操作:status Init_Stack(BDStacktype &tws,int m)//初始化一个大小为m的双向栈tws{ tws.base[0]=(Elemtype*)malloc(m*sizeof(Elemtype));tws.base[1]=tws.base[0]+m-1;tws.top[0]=tws.base[0];tws.top[1]=tws.base[1];return OK;}入栈操作:Status push(BDStacktype &tws,int i,Elemtype x) // x入栈,i=0表示低端栈,i=1表示高端栈{ if (tws.top[0]>tws.top[1]) return OVERFLOW;//注意此时的栈满条件if (i==0) *tws.top[0]++=x;elseif (i==1) *tws.top[1]--=x;else return ERROR;return OK;}出栈操作:Status pop(BDStacktype &tws, int i, Elemtype &x) // x出栈,i=0表示低端栈,i=1表示高端栈{ if (i==0){ if (tws.top[0]==tws.base[0]) return OVERFLOW;x=*--tws.top[0];}else if (i==1){ if (tws.top[1]==tws.base[1]) return OVERFLOW;x=*++tws.top[1];}else return ERROR;return OK;}P24/3.18试写一个判别表达式中开、闭括号是否配对出现的算法。
数据结构课后习题答案第三章
第三章栈和队列(参考答案)// 从数据结构角度看,栈和队列是操作受限的线性结构,其顺序存储结构// 和链式存储结构的定义与线性表相同,请参考教材,这里不再重复。
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);} // 算法结束。
数据结构教程第三版第三章课后习题答案
scanf("%d",&a); if (a>0) { if ((qu->rear+1)%QueueSize==qu->front)
printf(" 队列满,不能入队\n"); else { qu->rear=(qu->rear+1)%QueueSize; //入队
qu->data[qu->rear]=a; } } else if (a<0) { if (qu->rear==qu->front)
QT[x]=s;
之后 //让 QT[x]仍指向尾结点
}
}
void Create(QNode *QH[],QNode *QT[]) //根据用户输入创建队列
{ int n,x,i;
printf("n:");
scanf("%d",&n);
for (i=0;i<n;i++)
{ do
{ printf("输入第%d 个数:",i+1);
{ tail->next=QH[i];
tail=QT[i];
}
}
printf("\n 输出所有元素:");
while (head!=NULL)
{ printf("%d ",head->data);
head=head->next;
}
printf("\n");
}
void main()
{ int i; QNode *QH[MAXQNode],*QT[MAXQNode]; //各队列的队头 QH 和队尾指针 QT for
《数据结构(C语言版第2版)》(严蔚敏著)第三章练习题答案
《数据结构(C语言版第2版)》(严蔚敏著)第三章练习题答案《数据结构(C语言版第2版)》(严蔚敏著)第三章练习题答案第3章栈和队列1.选择题(1)若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在()种情况。
A.5,4,3,2,1 B.2,1,5,4,3 C.4,3,1,2,5 D.2,3,5,4,1答案:C解释:栈是后进先出的线性表,不难发现C选项中元素1比元素2先出栈,违背了栈的后进先出原则,所以不可能出现C选项所示的情况。
(2)若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为()。
A.i B.n-i C.n-i+1 D.不确定答案:C解释:栈是后进先出的线性表,一个栈的入栈序列是1,2,3,…,n,而输出序列的第一个元素为n,说明1,2,3,…,n一次性全部进栈,再进行输出,所以p1=n,p2=n-1,…,pi=n-i+1。
(3)数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为()。
A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n答案:D解释:对于非循环队列,尾指针和头指针的差值便是队列的长度,而对于循环队列,差值可能为负数,所以需要将差值加上MAXSIZE(本题为n),然后与MAXSIZE(本题为n)求余,即(n+r-f)%n。
(4)链式栈结点为:(data,link),top指向栈顶.若想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作()。
A.x=top->data;top=top->link;B.top=top->link;x=top->link;C.x=top;top=top->link;D.x=top->link;答案:A解释:x=top->data将结点的值保存到x中,top=top->link栈顶指针指向栈顶下一结点,即摘除栈顶结点。
《数据结构》第三章习题参考答案 殷人昆版
《数据结构》第三章习题参考答案殷人昆版,《数据结构》第三章习题参考答案一、判断题(在正确说法的题后括号中打“√”,错误说法的题后括号中打“×”)1、栈和队列都是线性表,只是在插入和删除时受到了一些限制。
( √ )2、循环队列也存在空间溢出问题。
( √ )3、任何一个递归过程都可以转换成非递归过程。
( √ )4、消除递归不一定需要使用栈。
( √ )5、有n个数顺序(依次)进栈,出栈序列有Cn种,Cn=(1/(n+1))*(2n)!/((n!)*(n!))。
(√ )6、循环队列方式能很好地解决队列的假溢出现象。
(√ )二、单项选择题1、1.设有一个顺序栈S,元素P1,P2,P3,P4,P5,P6依次进栈,得到的出栈顺序P2,P3,P4,P6,P5,P1,则顺序栈的容量至少为( B )。
A.2 B.3 C.4D.无法确定2.一个队列的输出序列是1,2,3,4,则队列的入队序列是( A )。
A.1,2,3,4 B.1,4,3,2 C.4,3,2,1 D.不确定3、对于一个循环队列(最大元素个数为maxSize)进行入队操作时,对队列指针的修改正确的语句是( C )。
A.rear = rear + 1 B.front = front + 1C.rear = (rear + 1)% maxSize D.front = (front + 1)% maxSize4、假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为( A )。
A.(rear-front+m)%m B.rear-front+1 C.(front-rear+m)%m D.(rear-front)%m5、表达式a*(b+c)-d的后缀表达式是( B )。
A.abcd*+- 表达式[a-(c*d+b)] B. abc+*d- C. abc*+d- 表达式b*c+a-d D. -+*abcd6、若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?( B )A. 1和 5B. 2和4C. 4和2D. 5和17、设abcdef以所给的次序进栈,若在进栈操作时,允许退栈操作,则下面得不到的序列为( D )。
数据结构第3章习题答案共7页word资料
head 11级计本、信本第3章 栈和队列 自测卷答案一、填空题(每空1分,共15分)1.向量、栈和队列都是 线性 结构,可以在向量的 任何 位置插入和删除元素;对于栈只能在 栈顶 插入和删除元素;对于队列只能在 队尾 插入和 队首 删除元素。
2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为 栈顶 。
不允许插入和删除运算的一端称为 栈底 。
3. 队列 是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
4. 在一个循环队列中,队首指针指向队首元素的 前一个 位置。
5. 在具有n 个单元的循环队列中,队满时共有 n-1 个元素。
6. 向栈中压入元素的操作是先 移动栈顶指针 ,后 存入元素 。
7. 从循环队列中删除一个元素时,其操作是 先 移动队首指针 ,后 取出元素 。
8.带表头结点的空循环双向链表的长度等于 0 。
解:二、判断正误(判断下列概念的正确性,并作出简要的说明。
)(每小题1分,共10分)( × )1. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。
错,线性表是逻辑结构概念,可以顺序存储或链式存储,与元素数据类型无关。
( × )2. 在表结构中最常用的是线性表,栈和队列不太常用。
错,不一定吧?调用子程序或函数常用,CPU 中也用队列。
( √ )3. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。
( √ )4. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。
正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
( × )5. 栈和链表是两种不同的数据结构。
错,栈是逻辑结构的概念,是特殊殊线性表,而链表是存储结构概念,二者不是同类项。
( × )6. 栈和队列是一种非线性数据结构。
错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
数据结构与算法 第3章习题
3 14
c. 删除P结点的语句序列是
10 7
3 14
(1) p =p->next; (2) p->next=p; (3) p->next=p->next->next; (4) p=p->next->next; (5) while( p!=NULL ) p=p->next; (6) while( Q->next!=NULL ) { p=Q; Q=Q->next; } (7) while( p->next!=Q ) p=p->next; (8) while( p->next->next!=Q ) p=p->next; (9) while( p->next->next!=NULL ) p=p->next; (10) Q=p; (11) Q=p->next; (12) p=L; (13) L=L->next; (14) free(Q)
8. 要求循环队列不损失一个空间全部都能得到利用, 设置一个标志域tag,并以tag的值为0或1来区分,头 尾指针相同时的队列状态的空与满。试编写与此结 构相应的入队列和出队列的算法。
typedef struct { ElemType elem[100]; int front; int rear; int tag; } Queue;
数据结构与算法
——第3章习题课
练习题
1. 已知L是带表头结点的非空单链表,且p 结点既不是首元结点,也不是尾元结点, 试从下列提供的答案中选择合适的语句序 列。
a. 删除P结点的直接后继结点的语句序列是
(1) p =p->next; 11 3 14 (2) p->next=p; (3) p->next=p->next->next; (4) p=p->next->next; (5) while( p!=NULL ) p=p->next; (6) while( Q->next!=NULL ) { p=Q; Q=Q->next; } (7) while( p->next!=Q ) p=p->next; (8) while( p->next->next!=Q ) p=p->next; (9) while( p->next->next!=NULL ) p=p->next; (10) Q=p; (11) Q=p->next; (12) p=L; (13) L=L->next; (14) free(Q)
数据结构第三章习题
数据结构第三章习题3.1 单项选择题2.一个栈的入栈序列a, b, c, d, e, 则栈的不可能的输出序列是。
A. edcbaB. DecbaC. DceabD. abcde3. 若已知一个栈的入栈序列是1,2,3,………..n, 其输出序列为p1, p2, p3,……,pn, 若p1=n, 则pi为。
A.i.B. n=IC. n- i+1D.不确定4.栈结构通常采用的两种存储结构是。
A. 顺序存储结构和链表存储结构B. 散链方式和索引方式C.链表存储结构和数组D. 线性存储结构和非线性存储结构5.判定一个栈ST(最多元素为m0)为空的条件是。
A. ST->top<>0B. ST->top=0C.ST->top<>m0D.ST->top=m06.判定一个栈ST(最多元素为m0)为栈满的条件是。
A. ST->top!=0B.ST->top==0C.ST->top!=m0D.ST->top==m07.栈的特点是,队列的特点是。
A先进先出 B. 先进后出8. 一个队列的入栈序列是1,2,3,4,则队列的输出序列是。
A. 4,3,2,1B. 1,2,3,4C. 1,4,3,2D. 3,2,4,19. 判定一个队列QU(最多元素为m0)为空的条件是。
A.QU->rear- QU->front==m0B.QU->rear- QU->front-1==m0C.QU->front== QU->rearD. QU->front== QU->rear+110.判定一个队列QU(最多元素为m0)为满队列的条件是。
A.QU->rear- QU->front==m0B.QU->rear- QU->front-1==m0C.QU->front== QU->rearD.QU->front== QU->rear+111. 判定一个循环队列QU(最多元素为m0)为空的条件是。
《数据结构(C语言版 第2版)》(严蔚敏 著)第三章练习题答案
《数据结构(C语言版第2版)》(严蔚敏著)第三章练习题答案第3章栈和队列1.选择题(1)若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在()种情况。
A.5,4,3,2,1 B.2,1,5,4,3 C.4,3,1,2,5 D.2,3,5,4,1答案:C解释:栈是后进先出的线性表,不难发现C选项中元素1比元素2先出栈,违背了栈的后进先出原则,所以不可能出现C选项所示的情况。
(2)若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为()。
A.i B.n-i C.n-i+1 D.不确定答案:C解释:栈是后进先出的线性表,一个栈的入栈序列是1,2,3,…,n,而输出序列的第一个元素为n,说明1,2,3,…,n一次性全部进栈,再进行输出,所以p1=n,p2=n-1,…,pi=n-i+1。
(3)数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为()。
A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n答案:D解释:对于非循环队列,尾指针和头指针的差值便是队列的长度,而对于循环队列,差值可能为负数,所以需要将差值加上MAXSIZE(本题为n),然后与MAXSIZE(本题为n)求余,即(n+r-f)%n。
(4)链式栈结点为:(data,link),top指向栈顶.若想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作()。
A.x=top->data;top=top->link;B.top=top->link;x=top->link;C.x=top;top=top->link;D.x=top->link;答案:A解释:x=top->data将结点的值保存到x中,top=top->link栈顶指针指向栈顶下一结点,即摘除栈顶结点。
数据结构课后答案第3章
第 3 章特殊线性表——栈、队列和串2005-07-14第 3 章特殊线性表——栈、队列和串课后习题讲解1. 填空⑴设有一个空栈,栈顶指针为1000H,现有输入序列为1、2、3、4、5,经过push,push,pop,push,pop,push,push后,输出序列是(),栈顶指针为()。
【解答】23,1003H⑵栈通常采用的两种存储结构是();其判定栈空的条件分别是(),判定栈满的条件分别是()。
【解答】顺序存储结构和链接存储结构(或顺序栈和链栈),栈顶指针top= -1和top=NULL,栈顶指针top等于数组的长度和内存无可用空间⑶()可作为实现递归函数调用的一种数据结构。
【解答】栈【分析】递归函数的调用和返回正好符合后进先出性。
⑷表达式a*(b+c)-d的后缀表达式是()。
【解答】abc+*d-【分析】将中缀表达式变为后缀表达式有一个技巧:将操作数依次写下来,再将算符插在它的两个操作数的后面。
⑸栈和队列是两种特殊的线性表,栈的操作特性是(),队列的操作特性是(),栈和队列的主要区别在于()。
【解答】后进先出,先进先出,对插入和删除操作限定的位置不同⑹循环队列的引入是为了克服()。
【解答】假溢出⑺数组Q[n]用来表示一个循环队列,front为队头元素的前一个位置,rear为队尾元素的位置,计算队列中元素个数的公式为()。
【解答】(rear-front+n)% n【分析】也可以是(rear-front)% n,但rear-front的结果可能是负整数,而对一个负整数求模,其结果在不同的编译器环境下可能会有所不同。
⑻用循环链表表示的队列长度为n,若只设头指针,则出队和入队的时间复杂度分别是()和()。
【解答】O(1),O(n)【分析】在带头指针的循环链表中,出队即是删除开始结点,这只需修改相应指针;入队即是在终端结点的后面插入一个结点,这需要从头指针开始查找终端结点的地址。
⑼串是一种特殊的线性表,其特殊性体现在()。
数据结构第三章习题答案
第三章习题1、按图3、1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答:⑴如进站得车厢序列为123,则可能得到得出站车厢序列就是什么?⑵如进站得车厢序列为123456,能否得到435612与135426得出站序列,并说明原因。
(即写出以“S”表示进栈、以“X”表示出栈得栈操作序列)。
2、设队列中有A、B、C、D、E这5个元素,其中队首元素为A。
如果对这个队列重复执行下列4步操作:(1)输出队首元素;(2)把队首元素值插入到队尾;(3)删除队首元素;(4)再次删除队首元素。
直到队列成为空队列为止,得到输出序列:(1)A、C、E、C、C (2) A、C、E(3) A、C、E、C、C、C (4) A、C、E、C3、给出栈得两种存储结构形式名称,在这两种栈得存储结构中如何判别栈空与栈满?4、按照四则运算加、减、乘、除与幂运算(↑)优先关系得惯例,画出对下列算术表达式求值时操作数栈与运算符栈得变化过程:A-B*C/D+E↑F5、试写一个算法,判断依次读入得一个以为结束符得字母序列,就是否为形如‘序列1& 序列2’模式得字符序列。
其中序列1与序列2中都不含字符’&’,且序列2就是序列1得逆序列。
例如,‘a+b&b+a’就是属该模式得字符序列,而‘1+3&3-1’则不就是。
6、假设表达式由单字母变量与双目四则运算算符构成。
试写一个算法,将一个通常书写形式且书写正确得表达式转换为逆波兰式。
7、假设以带头结点得循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应得队列初始化、入队列与出队列得算法。
8、要求循环队列不损失一个空间全部都能得到利用, 设置一个标志域tag , 以tag为0或1来区分头尾指针相同时得队列状态得空与满,请编写与此结构相应得入队与出队算法。
9、简述以下算法得功能(其中栈与队列得元素类型均为int):(1)void proc_1(Stack S){ int i, n, A[255];n=0;while(!EmptyStack(S)){n++; Pop(&S, &A[n]);} for(i=1; i<=n; i++)Push(&S, A[i]);}(2)void proc_2(Stack S, int e){ Stack T; int d;InitStack(&T);while(!EmptyStack(S)){ Pop(&S, &d);if (d!=e) Push( &T, d);}while(!EmptyStack(T)){ Pop(&T, &d);Push( &S, d);}}(3)void proc_3(Queue *Q){ Stack S; int d;InitStack(&S);while(!EmptyQueue(*Q)){DeleteQueue(Q, &d);Push( &S, d);}while(!EmptyStack(S)){ Pop(&S, &d);EnterQueue(Q,d)}}实习题1.回文判断。
数据结构第三章习题及解答
数据结构第三章习题及解答Chap3一选择题1. 对于栈操作数据的原则是(B)。
A. 先进先出B. 后进先出C. 后进后出D. 不分顺序2. 在作进栈运算时,应先判别栈是否( B ),在作退栈运算时应先判别栈是否( A )。
当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为( B )。
A. 空B. 满C. 上溢D. 下溢③: A. n-1 B. n C. n+1 D. n/23. 一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是(B)。
A. 不确定B. n-i+1C. iD. n-i4. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?(C)A. 5 4 3 6 1 2B. 4 5 3 1 2 6C. 3 4 6 5 2 1D. 2 34 15 65. 设栈的输入序列是1,2,3,4,则(D)不可能是其出栈序列。
A. 1,2,4,3,B. 2,1,3,4,C. 1,4,3,2,D. 4,3,1,2,6. 设一个栈的输入序列是1,2,3,4,5,则下列序列中,是栈的合法输出序列的是(D)。
A. 5 1 2 3 4B. 4 5 1 3 2C. 4 3 1 2 5D.3 2 1 5 47. 设有三个元素X,Y,Z顺序进栈(进的过程中允许出栈),下列得不到的出栈排列是( C)。
A.XYZ B. YZX C. ZXYD. ZYX8. 执行完下列语句段后,i值为:(B)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. 无限递归9. 用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队尾结点,则在进行删除操作时( D )。
A.仅修改队头指针 B. 仅修改队尾指针C. 队头、队尾指针都要修改D. 队头,队尾指针都可能要修改10. 递归过程或函数调用时,处理参数及返回地址,要用一种称为( C )的数据结构。
数据结构课后习题及解析第三章
第三章习题1.按图3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答:⑴如进站的车厢序列为123,则可能得到的出站车厢序列是什么?⑵如进站的车厢序列为123456,能否得到435612和135426的出站序列,并说明原因。
(即写出以“S”表示进栈、以“X”表示出栈的栈操作序列)。
2.设队列中有A、B、C、D、E这5个元素,其中队首元素为A。
如果对这个队列重复执行下列4步操作:(1)输出队首元素;(2)把队首元素值插入到队尾;(3)删除队首元素;(4)再次删除队首元素。
直到队列成为空队列为止,得到输出序列:(1)A、C、E、C、C (2) A、C、E(3) A、C、E、C、C、C (4) A、C、E、C3.给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满?4.按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程:A-B*C/D+E↑F5.试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1& 序列2’模式的字符序列。
其中序列1和序列2中都不含字符’&’,且序列2是序列1的逆序列。
例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。
6.假设表达式由单字母变量和双目四则运算算符构成。
试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。
7.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。
8.要求循环队列不损失一个空间全部都能得到利用, 设置一个标志域tag , 以tag为0或1来区分头尾指针相同时的队列状态的空与满,请编写与此结构相应的入队与出队算法。
9.简述以下算法的功能(其中栈和队列的元素类型均为int):(1)void proc_1(Stack S){ int i, n, A[255];n=0;while(!EmptyStack(S)){n++; Pop(&S, &A[n]);} for(i=1; i<=n; i++)Push(&S, A[i]);}(2)void proc_2(Stack S, int e) { Stack T; int d;InitStack(&T);while(!EmptyStack(S)){ Pop(&S, &d);if (d!=e) Push( &T, d);}while(!EmptyStack(T)){ Pop(&T, &d);Push( &S, d);}}(3)void proc_3(Queue *Q){ Stack S; int d;InitStack(&S);while(!EmptyQueue(*Q)){DeleteQueue(Q, &d);Push( &S, d);}while(!EmptyStack(S)){ Pop(&S, &d);EnterQueue(Q,d)}}实习题1.回文判断。
数据结构习题2
dequeue(q,y);printf(y);//龚注:printf(“%c”,y); } printf(x);//龚注:printf(“%c”,x); } 15. 有如下递归函数:【**】 int dunno(int m){ int value; if(m==0)
【**,★】(a1一定是最后出的)
A、a3,a1,a4,a2
B、 a3,a2,a4,a1
C、 a3,a4,a2,a1
D、 a4,a3,a2,a1
2/10 北京理工大学珠海学院计算机学院 “数据结构”课程组编制 2011-3-1
数据结构课后练习题
第 3 章 栈和队列
图3.1
21. 链栈和顺序栈相比,有一个比较明显的优势是( A )【*】
三、 填空题
1. 1、2、3、4 顺序入栈,则出入栈的序列共有( 14 )种。【***,★】
2. 栈的特点是( 后进先出 ),队列的特点是( 先进先出 )。【*】
3. 线性表、栈、队列都是( 线性 )结构,可以在线性表的( 任意 )位置插入和删除元素;对于栈只能在
( 栈顶 )插入和删除元素;对于队列只能在( 队尾 )插入元素和在( 队首)位置删除元素。【*,
的顺序是( C )。【***,★,考研 2010】
A. bacde
B. dbace
C. dbcae
D. ecbad
25. 已知输入序列为 abcd,经过输出受限的双端队列后能得到的输出序列是( B )。【***,联考】
A. dacb
B. cadb
C. dbca
D. 以上序列都不能得到
26. 栈和队列具有相同的( B )。【**,★,联考】
数据结构(第二版)习题答案第3章
3.1 选择题第3章线性表的链式存储(1)两个有序线性表分别具有n个元素与m个元素且n≤m,现将其归并成一个有序表,其最少的比较次数是( A )。
A.n B.m C.n− 1 D.m + n(2)非空的循环单链表 head 的尾结点(由 p 所指向)满足( C )。
A.p->next==NULL B.p==NULL C.p->next==head D.p==head (3)在带头结点的单链表中查找x应选择的程序体是( C )。
A.node *p=head->next; while (p && p->info!=x) p=p->next;if (p->info==x) return p else return NULL;B.node *p=head; while (p&& p->info!=x) p=p->next; return p;C.node *p=head->next; while (p&&p->info!=x) p=p->next; return p;D.node *p=head; while (p->info!=x) p=p->next ; return p;(4)线性表若采用链式存储结构时,要求内存中可用存储单元的地址( D )。
A.必须是连续的C.一定是不连续的B.部分地址必须是连续的D.连续不连续都可以(5)在一个具有n个结点的有序单链表中插入一个新结点并保持单链表仍然有序的时间复杂度是( B )。
A.O(1) B.O(n) C.O(n2) D.O(n log2n)(6)用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队尾结点,则在进行删除操作时(D )。
A.仅修改队头指针C.队头、队尾指针都要修改B.仅修改队尾指针D.队头,队尾指针都可能要修改(7)若从键盘输入n个元素,则建立一个有序单向链表的时间复杂度为( B )。
数据结构第3章 栈和队列习题课
3.4简述以下算法的功能
(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); } }
习题课
第3章 栈和队列
3.1
(1)如果进站的车厢序列为123,则可能得到 的出站车厢序列是什么? (2)如果进站的车厢序列为123456,则能否 得到435612和135426出站序列,并请说 明为什么不能得到或如何得到。
(1) 123 , 132 , 213 , 231 , 321 (2) 435612不能得到(6出站时,12必须在站中,只能出站成21,无法 得到12) 135426可以 1S1X2S3S3X4S5S5X4X2X6S6X
3.28 带头指针的循环链表表示队列,并且 只设一个指针指向队尾结点,编写队列初始 化、入队列和出队列算法
typedef struct QNode{ QElemTypቤተ መጻሕፍቲ ባይዱ data; Struct Qnode *next; }QNode,*QueuePtr; typedef struct { QueuePtr rear; }LinkQueue;
3.4简述以下算法的功能
(1)status algol(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]); }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构第三章习题课1. 一个栈的输入序列为1 2 3 4 5,则下列序列中不可能是栈的输出序列的是()。
A. 2 3 4 1 5B. 5 4 1 3 2C. 2 3 1 4 5D. 1 5 4 3 22. 一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i (1<=i<=n)个元素是()。
A. 不确定B. n-i+1C. iD. n-i3. 若栈采用顺序存储方式存储,现两栈共享空间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]4. 栈在()中应用。
A. 递归调用B. 子程序调用C. 表达式求值D. A,B,C5. 执行完下列语句段后,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. 无限递归6. 表达式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;(*^(-7. 用链接方式存储的队列,在进行删除运算时()。
A. 仅修改头指针B. 仅修改尾指针C. 头、尾指针都要修改D. 头、尾指针可能都要修改8. 循环队列存储在数组A[0..m]中,则入队时的操作为()。
A. rear=rear+1B. rear=(rear+1) mod (m-1)C. rear=(rear+1) mod mD. rear=(rear+1)mod(m+1)9. 设栈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. 210.表达式23+((12*3-2)/4+34*5/7)+108/9的后缀表达式是_______。
答:23.12.3*2-4/34.5*7/++108.9/+(注:表达式中的点(.)表示将数隔开,如23.12.3是三个数)L=head 头结点 R=headhe 11. 一个栈的输入序列是:1,2,3则不可能的栈输出序列是_______。
答:3 1 212、 链栈中为何不设置头结点?答:链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。
1. 【李春葆】向量、栈和队列都是 线性 结构,可以在向量的 任何 位置插入和删除元素;对于栈只能在 栈顶 插入和删除元素;对于队列只能在 队尾 插入和 队首 删除元素。
2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为 栈顶 。
不允许插入和删除运算的一端称为 栈底 。
3. 队列 是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
4. 在具有n 个单元的循环队列中,队满时共有 n-1 个元素。
5. 〖00年统考题〗带表头结点的空循环双向链表的长度等于 0 。
判断正误(判断下列概念的正确性,并作出简要的说明。
)(×)1. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。
错,线性表是逻辑结构概念,可以顺序存储或链式存储,与元素数据类型无关。
(×)2. 在表结构中最常用的是线性表,栈和队列不太常用。
错,不一定吧?调用子程序或函数常用,CPU 中也用队列。
(√)3. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。
(√)4. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。
正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
(×)5. 栈和链表是两种不同的数据结构。
错,栈是逻辑结构的概念,是特殊殊线性表,而链表是存储结构概念,二者不是同类项。
(×)6. 栈和队列是一种非线性数据结构。
错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
(√)7. 栈和队列的存储方式既可是顺序方式,也可是链接方式。
(√)8. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。
(×)9. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。
错,后半句不对。
(×)10. 一个栈的输入序列是12345,则栈的输出序列不可能是12345。
错,有可能。
单项选择题1. 〖00年元月统考题〗栈中元素的进出原则是。
A.先进先出B.后进先出C.栈空则进D.栈满则出2. 〖李春葆〗若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为。
A.i B.n=i C.n-i+1 D.不确定解释:当p1=n,即n是最先出栈的,根据栈的原理,n必定是最后入栈的,那么输入顺序必定是1,2,3,…,n,则出栈的序列是n,…,3,2,1。
3. 〖李春葆〗判定一个栈ST(最多元素为m0)为空的条件是。
A.ST->top<>0 B.ST->top=0 C.ST->top<>m0 D.ST->top=m04. 〖李春葆〗判定一个队列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+15. 【98初程P71】从供选择的答案中,选出应填入下面叙述?内的最确切的解答,把相应编号写在答卷的对应栏内。
设有4个数据元素a1、a2、a3和a4,对他们分别进行栈操作或队操作。
在进栈或进队操作时,按a1、a2、a3、a4次序每次进入一个元素。
假设栈或队的初始状态都是空。
现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时,第一次出栈得到的元素是 A ,第二次出栈得到的元素是 B 是;类似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;这时,第一次出队得到的元素是 C ,第二次出队得到的元素是 D 。
经操作后,最后在栈中或队中的元素还有 E 个。
供选择的答案:A~D:①a1 ②a2 ③a3 ④a4E:①1 ②2 ③3 ④0答:ABCDE=2, 4, 1, 2, 26. 【94初程P75】从供选择的答案中,选出应填入下面叙述?内的最确切的解答,把相应编号写在答卷的对应栏内。
栈是一种线性表,它的特点是 A 。
设用一维数组A[1,…,n]来表示一个栈,A[n]为栈底,用整型变量T指示当前栈顶位置,A[T]为栈顶元素。
往栈中推入(PUSH)一个新元素时,变量T的值 B ;从栈中弹出(POP)一个元素时,变量T的值 C 。
设栈空时,有输入序列a,b,c,经过PUSH,POP,PUSH,PUSH,POP操作后,从栈中弹出的元素的序列是 D ,变量T的值是 E 。
供选择的答案:A:①先进先出②后进先出③进优于出④出优于进⑤随机进出B,C:①加1 ②减1 ③不变④清0 ⑤加2 ⑥减2D:①a,b ②b,c ③c,a ④b,a ⑤c,b ⑥a,cE:①n+1 ②n+2 ③n ④n-1 ⑤n-2答案:ABCDE=2, 2,1,6,4注意,向地址的高端生长,称为向上生成堆栈;向地址低端生长叫向下生成堆栈,本题中底部为n,向地址的低端递减生成,称为向下生成堆栈。
2. 【统考书P60 4-11,难于严题集3.1①】设有编号为1,2,3,4的四辆列车,顺序进入一个栈式结构的车站,具体写出这四辆列车开出车站的所有可能的顺序。
答:至少有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,38. 【91初程P77】从供选择的答案中,选出应填入下面叙述?内的最确切的解答,把相应编号写在答卷的对应栏内。
在做进栈运算时,应先判别栈是否 A ;在做退栈运算时,应先判别栈是否 B 。
当栈中元素为n个,做进栈运算时发生上溢,则说明该栈的最大容量为 C 。
为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的 D 分别设在这片内存空间的两端,这样,只有当 E 时,才产生上溢。
供选择的答案:A,B:①空②满③上溢④下溢C:①n-1 ②n ③n+1 ④n/2D:①长度②深度③栈顶④栈底E:①两个栈的栈顶同时到达栈空间的中心点②其中一个栈的栈顶到达栈空间的中心点③两个栈的栈顶在栈空间的某一位置相遇④两个栈均不空,且一个栈的栈顶到达另一个栈的栈底答案:ABCDE=2, 1, 2, 4, 34. 【统考书P60 4-13】顺序队的“假溢出”是怎样产生的?如何知道循环队列是空还是满?答:一般的一维数组队列的尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出”。
采用循环队列是解决假溢出的途径。
另外,解决队满队空的办法有三:①设置一个布尔变量以区别队满还是队空;②浪费一个元素的空间,用于区别队满还是队空。
③使用一个计数器记录队列中元素个数(即队列长度)。
我们常采用法②,即队头指针、队尾指针中有一个指向实元素,而另一个指向空闲元素。
判断循环队列队空标志是:f=rear 队满标志是:f=(r+1)%N5. 【统考书P60 4-14】设循环队列的容量为40(序号从0到39),现经过一系列的入队和出队运算后,有①front=11,rear=19; ②front=19,rear=11;问在这两种情况下,循环队列中各有元素多少个?答:用队列长度计算公式:(N+r-f)% N①L=(40+19-11)% 40=8 ②L=(40+11-19)% 40=321.【严题集3.3②】写出下列程序段的输出结果(栈的元素类型SElem Type为char)。