数据结构练习题 第三章 栈、队列和数组 习题及答案备课讲稿

数据结构练习题 第三章 栈、队列和数组 习题及答案备课讲稿
数据结构练习题 第三章 栈、队列和数组 习题及答案备课讲稿

数据结构练习题第三章栈、队列和数组

习题及答案

第三章栈、队列和数组

一、名词解释:

1.栈、栈顶、栈底、栈顶元素、空栈

2.顺序栈

3.链栈

4.递归

5.队列、队尾、队头

6.顺序队

7.循环队

8.队满

9.链队10.随机存储结构11.特殊矩阵12.稀疏矩阵13.对称方阵14.上(下)三角矩阵

二、填空题:

1.栈修改的原则是_________或称________,因此,栈又称为________线性

表。在栈顶进行插入运算,被称为________或________,在栈顶进行删

除运算,被称为________或________。

2.栈的基本运算至少应包括________、________、________、________、

________五种。

3.对于顺序栈,若栈顶下标值top=0,此时,如果作退栈运算,则产生

“________”。

4.对于顺序栈而言,在栈满状态下,如果此时在作进栈运算,则会发生

“________”。

5.一般地,栈和线性表类似有两种实现方法,即________实现和________

实现。

6.top=0表示________,此时作退栈运算,则产生“________”;

top=sqstack_maxsize-1表示________,此时作进栈运算,则产生

“________”。

7.以下运算实现在顺序栈上的初始化,请在________处用适当的句子予以

填充。

int InitStack(SqStackTp *sq)

{ ________;

return(1);}

8.以下运算实现在顺序栈上的进栈,请在________处用适当的语句予以填

充。

Int Push(SqStackTp *sq,DataType x)

{ if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);}

else{________________:

________________=x;

return(1);}

}

9.以下运算实现在顺序栈上的退栈,请在________________用适当句子予

以填充。

Int Pop(SqStackTp *sq,DataType *x)

{if(sp->top==0){error(“下溢”);return(0);}

else{*x=________________;

________________;

return(1);}

}

10. 以下运算实现在顺序栈上判栈空,请在________________处用适当句子予以填充。

Int EmptyStack(SqStackTp *sq)

{if(________________) return(1);

else return(0);

}

11.以下运算实现在顺序栈上取栈顶元素,请在________________处用适当句子予以填充。

Int GetTop(SqStackTp *sq,DataType *x)

{if(________________) return(0);

else{*x=________________;

return(1);}

}

12. 以下运算实现在链栈上的初始化,请在________________处用请适当句子予以填充。

Void InitStacl(LstackTp *ls){ ________________;}

13.` 以下运算实现在链栈上的进栈,请在处用请适当句子予以填充。

Void Push(LStackTp *ls,DataType x)

{ LstackTp *p;p=malloc(sizeof(LstackTp));

________________;

p->next=ls;

________________;

}

14.以下运算实现在链栈上的退栈,请在________________处用请适当句子予以填充。

Int Pop(LstackTp *ls,DataType *x)

{LstackTp *p;

if(ls!=NULL)

{ p=ls;

*x=________________;

ls=ls->next;

________________;

return(1);

}else return(0);

}

15. 以下运算实现在链栈上读栈顶元素,请在________________处用请适当句子予以填充。

Int Get Top(LstackTp *ls,DataType *x)

{ if(ls!=NULL){ ________________;return(1);}

else return(0);

}

16.必须注意,递归定义不能是“循环定义”。为此要求任何递归定义必须同时满足如下条件:

①被定义项在定义中的应用(即作为定义项的出现)具有

________________;

②被定义项在最小“尺度”上的定义不是________________的。

17.队列简称________________。在队列中,新插入的结点只能添加到

________________,被删除的只能是排在________________的结点。

18.队列以线性表为逻辑结构,至少包括________________、

________________、________________、________________

________________、五种基本运算。

19.顺序队的出、入队操作会产生“________________”。

20.以下运算实现在循环队上的初始化,请在________________处用适当句子予以填充。

Void InitCycQueue(CycqueueTp *sq)

{ ________________;sq->rear=0;}

21. 以下运算实现在循环队上的入队列,请在________________处用请适当句子予以填充。

Int EnCycQueue(CycquereTp *sq,DataType x)

{ if((sq->rear+1)%maxsize== ________________)

{error(“队满”);return(0);

else{ ________________;

________________ ________________;

return(1);

}

22. 以下运算实现在循环队上的出队列,请在________________处用适当句子予以填充。

Int OutCycQueue(CycquereTp *sq,DataType *x)

{if(sq->front== ________________){error(“队空”);return(0);}

else{ ________________;

________________;

return(1);

}

}

23. 以下运算实现在循环队上判队空,请在________________处用适当句子予以填充。

Int EmptyCycQueue(CycqueueTp sq)

{if(________________) return(1);

else return(0);

}

24. 以下运算实现在循环队上取队头,请在________________处用适当句子予以填充。

Int GetHead(CycqueueTp sq,DataType *x)

{ if(sq.rear== ________________return(0);

else{ *x=sq.data[________________ ];

return(1);

}

25.链队在一定范围内不会出现________________的情况。当lq.front==lq.rear 试,队中无元素,此时________________。

26.以下运算实现在链队上的初始化,请在________________处用适当句子予以填充。

void InitQueue(QueptrTp *lp)

{ LqueueTp *p;

p=(LqueueTp *)malloc(sizeof(LqueueTp));

________________;

lq->rear=p;

(lq->front)->next=________________;

}

27. 以下运算实现在链队上的入队列,请在________________处用适当句子予以填充。

Void EnQueue(QueptrTp *lq,DataType x)

{ LqueueTp *p;

p=(LqueueTp *)malloc(sizeof(LqueueTp));

________________=x;

p->next=NULL;

(lq->rear)->next=________________;

________________;

}

28. 以下运算实现在链队上的出队列,请在________________处用适当句子予以填充。

int OutQueue(QuetrTp *lq,DataType *x)

{ LqueueTp *s;

if(lq->front==lq->rear){erroe(“队空”);return(0);}

else { s=(lq->front)->next;

________________=s->data;

(lq->front)->next=________________;

if(s->next==NULL) lq->rear=lq->front;

free(s);

return(1);

}

}

29. 以下运算实现在链队上判队空,请在________________处用适当句子予以填充

int EmptyQueue(QueptrTp *lq)

{ if(________________) return(1);

else return(0);

}

30. 以下运算实现在链队上读队头元素,请在________________处用适当句子予以填充。

Int GetHead(QueptrTp lq,DataType *x)

{ LqueueTp *p;

if(lq.rear==lq.front) return(0);

else{________________;

________________ =p->data;

return(1);

}

}

31.一般地,一个n维数组可视为其数据元素为___________维数组的线性表。数组通常只有___________和___________两种基本运算。

32,通常采用___________存储结构来存放数组。对二维数组可有两种存储方法:一种是以

___________为主序的存储方式,另一种是以___________为主序的存储方式。C语言数组用的是以___________序为主序的存储方法;FORTRAN语言用的是以___________序为主序的存储方法

33.需要压缩存储的矩阵可分为___________矩阵和___________矩阵两种。

34.对称方阵中有近半的元素重复,若为每一对元素只分配一个存储空间,则可将n2个元素压缩存储到___________个元素的存储空间中。

35.假设以一维数组M(1:n(n+1)/2)作为n阶对称矩阵A的存储结构,以行序为主序存储其下三角(包括对角线)中的元素,数组M和矩阵A间对应的关系为___________。36.上三角矩阵中,主对角线上的第t行(1<=t<=n)有___________个元素,按行优先顺序存放上三角矩阵中的元素a ij时,a ij之前的前i-1行共有___________个元素,在第i行上,a ij是该行的第___________个元素,M[k]和a ij的对应关系是。

当i>j时,a ij=c,c存放在M[___________]中。

37.下三角矩阵的存储和对称矩阵类似。M[K]和a ij的对应关系是___________。

38.基于三元组的稀疏矩阵转置的处理方法有两种,以下运算按照矩阵A的列序来进行转置,请在___________处用适当的句子用以填充。

Trans_Sparmat(SpMatrixTp a,SpMatrixTp *b)

{ (*b).mu=a.nu;(*b).nu=a.mu;(*b).tu=a.tu;

if(a.tu)

{ q=1;

for(col=1; ___________;col++)

for(p=1;p<=a.tu;p++)

if(___________==col)

{(*b).data[q].i=a.data[p].j;

(*b).data[q].j=a.data[p].i;

(*b).data[q].v=a.data[p].v;

___________;

}

}

39.基于三元组的稀疏矩阵转置的处理方法有两种,以下计算按照矩阵A的三元组a.data的次序进行转置,请在___________处用适当的句子用以填充。

Fast_Trans_Sparmat(SpMatrixTp a,SpMatrixTp *b)

{ (*b).mu=a.nu;(*b).nu=a.mu;(*b).tu=a.tu=a.tu;

if(a.tu)

{for(col=1;___________;col++) num[col]=0;

for(t=1;t<=a,tu;t++) num[a.data[t].j]++;

cpot[1]=1;

for(col=2;col<=a.nu;col++) cpot[col]=___________;

for(p=1;p<=a.tu;p++)

{ col=a.data[p].j;

q=cpot[col];

(*b).data[q].i=a.data[p].j;

(*b).data[q].j=a.data[p].i;

(*b).data[q].v=a.data[p].v;

__________________________;

}

}

}

40.栈称为___________线性表。 ;

41.队称为___________线性表。

42设一个链栈的栈顶指针为ls,栈中结点的格式为 info next,栈空的条件是___________;如果栈不为空,则退栈操作为p=ls; ___________;ls=ls->next;free(p)。

43.设有二为数组int M[10][20](注:m为0...10,n为0...20),每个元素(整数)栈两个存储单元,数组的起始地址为2000,元素M[5][10]的存储位置为___________,M[8][19]的存储值为___________。

44.在具有n个单元的循环队列中,队满时共有___________个元素。

45.___________可以作为实现递归函数调用的一种数据结构。

46.数组M中每个元素的长度是3个字节,行下标i从1到8,列下标j从1到0,从首的址EA开始连续存放在存储其中。若按行方式存放,元素M[8][5]的起始地址为___________;若按列优先方式存放,元素M[8][5]的地址为___________。

47.对带有头结点的列队列lq,判定队列中只有一个数据元素的条件是___________。

48.二维数组M的成员是6个字符(每个字符栈一个存储单元)组成的串,行下标i 的范围从0到8,列下标j的范围从1到10,则存放M至少需要___________个字节;M的第8列和第5行共占___________个字节;若M按行方式存储,元素M[8][5]的起始地址与当M按列优先方式存储时的___________元素的起始地址一致。

三、单项选择题

1.在以下栈的基本运算中,不是加工型运算的是()

①lnitStack(S) ②Push(S,X) ③Pop(S) ④empty(S)

2.以下说法正确的是 ( )

①因链栈本身没有容量限制,故在用户内存空间的范围内不会出现栈满情况

②因顺序栈本身没有容量限制,故在用户内存空间的范围内不会出现栈满情况

③对于链栈而言,在栈满状态下,如果此时再作进栈运算,则会发生“上溢”

④对于顺序栈而言在栈满状态下如果此时再作迸栈运算,则会发生“下溢”。

3.在以下队列的基本运算中,不是加工型运算的是()

①InitQueue(Q) ②EnQueue(Q,X) ③OutQueu(Q,X) ④GetHead(Q,x)

4.顺序队列的人队操作应为 ( )

①sq.rear=sq.rear+1 sq.data[sq.rear]=x

②sq.data[sq.rear]=x sq.rear=sq.rear+1

③sq.rear=(sq.rear+1)% maxsize; sq.data[sq.rear]=x

④sq.data[sqrear]=x sq.rear=(sq.rear+1)% maxsize

5.循环队列的人队操作应为 ( )

①sq.rear=sq.rear+1 sq.data[sq.rear]=x

②sq.data[sq.rear]=x sq.rear=sq.rear+1

③sq.rear=(sq.rear+1)% maxsize sq.data[sq.rear]=x

④sq.data[sq.rear]=x sq.rear=(sq.rear+1)% maxsize

6. 顺序队列的出队操作为 ( )

①sq.front=(sq.front+1)% maxsize

②sq.front=sq.front+1

③sq.rear=(sq.rear+1)% maxsize

④sq.rear=sq.rear+1

7. 循环队列的出队操作为 ( )

①sq.front=(sq.ftont+1)% maxsize

②sq.front=sq.front+1

③sq.rear=(sq.rear+)% maxsize

④sq.rear=sq.rear+1

8.循环队列的队满条件为 ( )

①(sq.rear+1) % mazsize ==(sq.front+1) % maxsize;

②(sq.rear+1 % maxsize ==sq.front+1

③sq.(rear+1) % maxsize ==sq.front

④sq.rear ==sq.front

9.循环队列的队空条件为 ( )

①(sq.rear+1) % maxsize ==(sq.front+1) % maxsize

②(sq.rear+) % maxsize ==sq.front+1

③(sp.rear+1) % maxsize ==sq.front

④sq.rear == sq.front

10.数组的数据元素类型DataType可根据实际需要而定义。以下说法完全正确的是 ( )

①数组的读运算可以读取一个数据元素整体,写运算只能修改一个数据元素的一部分

②数组的读、写运算可以读取或修改一个数据元素的一部分或一个整体

③数组的读、写运算只能读取或修改一个数据元素的一部分

④数组的读、写运算只能读取或修改一个数据元素整体

11.对于以行序为主序的存储结构来说,在数组A[c1···d1,c2···d2]中,c1和d1分别为

数组A的第一个下标的上、下界,c2…d2分别为第二各下标的上、下界,每个数据元素占K 个存储单元,二维数组中任一元素a[i,j]的存储位置可由( )式确定.

①Loc[i,j]=[( d2-c2+1)(i- c1)+(j- c2)]*k

②Loc[i,j]=loc[c1, c2]+[( d2- c2+1)(i- c1)+(j- c2)]*k

③Loc{i,j}=A[c1, c2]+[( d2- c2+1)(i- c1)+(j- c2)]*k

④Loc[i,j]=loc[0,0]+[( d2- c2+1)(i- c1)=(j- c2)]*k

12对于C语言的二维数组DataType A[m][n],每个数据元素占K个存储单元,二维数组中任意元素a[i,j] 的存储位置可由( )式确定.

①Loc[i,j]=A[m,n]+[(n+1)*i+j]*k

②Loc[i,j]=loc[0,0]+[(m+n)*i+j]*k

③Loc[i,j]=loc[0,0]+[(n+1)*i+j]*k

④Loc[i,j]=[(n+1)*i+j]*k

13.线性表的顺序存储结构是一种( )的存储结构,线性表的链式存储结构是一种()的存储结构。

①随机存取②顺序存储

14.如果以链表作为栈的存储结构,则退栈操作是 ( )

①必须判别栈是否满②必须判别栈是否空

③判别栈元素的类型④对栈不做任何操作

15对于基于三元组的稀疏矩阵转置的处埋方法以下说法正确的是 ( )

①按照矩阵A的列序来进行转置,算法的时间复杂度为0(nu+tu)

②按照A的三元组a.data的次序进行转置,算法的时间复杂度为O(nu*tu)

③按照矩阵A的列序来进行转置的方法称快速转置

④按照矩阵A的列序进行转置,对于tu<

16.稀疏矩阵的压缩存储方法是只存储 ( )

①非零元素②三元祖(i,j, a ij)③ a ij④ i,j

17.基于三元组的稀疏矩阵,对每个非零元素a ij,可以用一个()唯一确定。

①非零元素②三元组(i,j,a ij) ③ a ij④ i,j

18如果以链表作为栈的存储结构,则退栈操作时 ( )

①必须判别栈是否满②判别栈元素的类型

③必须判别栈是否空④队栈不做任何判别

19.设C语言数组Data[m+1]作为循环队列SQ的存储空间, front为队头指针,rear为队为指针,则执行出队操作的语句为()

①front=front+1 ② front=(front+1)%m

③rear=(rear+1)%m ④ front=(front+1)%(m+1)

20.三角矩阵可压缩存储到数组()中。

①M[1:n(n+1)/2+1] ② M[1:n(n+1)/2]

③M[n(n+1)/2+1] ④M[n(n+1)/2]

21.设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出线的顺序是s2,s3,s4, s6 , s5,s1,则栈的容量至少应该是()

①2 ② 3 ③ 5 ④6

22.设有一顺序栈已含3个元素,如下图所示,元素a4正等待进栈。那么下列4个序列

中不可能出现的出栈序列是()

0 1 2 3 maxsize-1

sq

↑top

①a3,a1,a4,a2 ②a3,a2,a4,a1 ③ a3,a4,a2,a1 ④a4,a3,a2,a1

23.向一个栈顶指针为Top的链中插入一个s所指结点时,其操作步骤为()

①Top->next=s ② s->next=Top->next;Top->next=s

③s->next=Top;Top=s ④ s->next=Top;Top=Top->next

24.从栈顶指针为Top的链栈中删除一个结点,并将被删节点的值保存到x中,其操作步骤为()

①x=Top->data;Top=Top->next ②Top=Top->next;x=Top->data

③x=Top;Top=Top->next ④ x=Top->data

25.在一个链队中,若f,r分别为队首、队尾指针,则插入s所指结点的操作为()

①f->next=c;f=s ②r->next=s;r=s

③s->next=r;r=s ④ s->next=f;f=s

26常对数组进行的两种基本操作是()

①建立与删除②索引与修改③查找与修改④查找与索引

27.链栈与顺序栈相比,有一个比较明显的优点即()

①插入操作更方便②通常不会出现栈满的情况

③不会出现栈空的情况④删除操作更方便

28.若采用三元组压缩技术存储稀疏矩阵,只要把每个元素的行下标和列下标互换,就完成

了对该矩阵的转置运算,这种观点()①正确②错误

29。二为数组M[i,j]的元素是4个字符(每个字符占一个存储单元)组成的串,行下标i 的范围从O到4,列下标j的范围从O到5。M按行存储时元素M[3,5] 的起始地址与M按列存储时元素( )的起始地址相同。

①M [2,4] ② M[3,4] ③M[3,5] ④M[4,4]

30.一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是()

① e d c b a ②d e c b a ③d c e a b ④a b c d e

31.一个队列的人列序是1,2,3,4,则队列的输出系列是()

① 4,3,2,1 ② 1,2,3,4,③1,4,3,2 ④ 3,2,4,1 32.设计一个判别表达式中左、右括号是否配对出线的算法,采用()数据结构最佳。

①线性标的顺序存储结构②栈

③队列④线性表的链式存储结构

33.若已知一个栈的输入序列为1,2,3,...,n,其输出序列为P1、P2、...P n。若p1=n,则P1为

①i ②n=i ③ n-i+1 ④不确定

34.以下说法正确的是

①顺序队和循环队的队满和队空判断条件是一样的

②栈可以作为实现过程调用的一种数据结构

③插人和删除操作是数据结构中最基本的两种操作,所以这两种操作在数组中也经常使用

④在循环队列中,front指向队列中第一个元素的前一位置,rear指向实际的队尾元素,队列为满的条件front=rear

35. 以下说法正确的是

①数组是同类型值的集合

②数组是一组相继的内存单元

③数组是一种复杂的数据结构,数组元素之间的关系,既不是线性的,也不是树形的

④使用三元组表表示稀疏矩阵的元素,有时并不能节省存储空间

四、简答及应用

1.简述顺序栈的类型定义。

2.简述链栈的类型定义。

3.简述顺序队列、循环队列的类型定义。

4.简述链队的类型定义。

5,写出基于三元组的稀疏矩阵的类型说明。

6.对于循环队列,试写出求队列长度的算法。

7.设有编号为t,2,3,4的四辆列车。顺序进入一个占世界共的展台,试写出这四两列车开出车站的所有可能的顺序。

8设有上三角矩阵(a ij)n*n,将其上三角元素逐行存于数组B(1:m)中(m充分大),使得B[k]=a ij,且k=f1(i)+f2(j)+c。是推导出函数f1,f2和常数c(要求f1和f2中不含常数项)。9.设有三对角矩阵(a ij)n*n,将其三条对角线上的元素逐行存于数组B(1:3n-2)中,使得B[k]=a ij,求:

(1)用i、j表示k的下标变换公式;

(2)用k表示i、j的下标变换公式.

10.阅读下列程序,写出程序的运行结果。

# define sqstack_maxsize 40

typedef struct sqstack

{ char data[sqstack_maxsize];

int top;

} SqStackTp;

main()

{ SqStackTp sq;

int i;

char ch;

InitStack(&sq);

For(ch=’A’;ch<=’A’+12;ch++)

{ Push(&sq,ch);

printf(“%c”,ch);

}

printf(“\n”);

while(!EmptyStack(sq))

{ Pop(&sq,&ch);

printf(“&c”,ch);

} printf(“\n”);

}

11.阅读下列算法,写出其完整的功能。

Void reverse_list( LinkedListTP *head)

{ LstackTP ls,p;

DataType x;

InitStack(&ls);

p=head->next;

While(p!=NULL)

{ Push(&lsdata);

p=p->next;}

p=head->next;

While(! EmptyStack(&ls))

{ Pop(&l,&x); p->data=x;

p=p-next;}

}

12,对下列函数,按照《数据结构导论》课本的图3-5失利,画出调用f(5)是引起的工作栈状态变化情况。

Int f(int I)

{ if(n==1) return(10);

else return(f(I-1)+2);

}

五、算法设计

1.某汽车轮渡口,过江渡船每次能载10辆车过江。过江车辆分为客车类和货车类,

上渡船的有如下规定:同类车先到先上船;且每上4辆客车,才允许上一辆货车;若等待客车不足4辆,则以火车代替,若无货车等待允许客车都上船。试写一算法模拟渡口管理。

可以在一个数组中保存两个栈:一个栈以数组的第一个单元作为栈底,另一个栈以

数组的最后一个单元作为栈底(如下图所示)。设S 是其中一个占,是分别编写过程push(S,X)(元素X 入栈), 出栈pop(S)和取栈顶元素Top(S).题示:设其中一个栈为0,另一栈为1。

0 1 2 M-1 M M+1

0底

栈0顶 栈1顶 栈1底 3.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的初始化队列、入队列和出队列算法。

4.假设以数组cycque[m](假设数组范围在0..m)存放循环队列的元素,同时设变量rear 和quelen 分别指示循环队列中队尾元素位置和内含元素的个数。试给出此循环队列的队满条件,并写出相应的入队列和出队列的算法。

5.编写算法:按行优先存储顺序,将稀疏矩阵转换为三元组的表示形式。

6.稀疏矩阵用三元组的表示形式,试写一算法实现两个稀疏矩阵相加,结果仍用三元组表示。

7.假设一个算术表达式中可以包含三中括号:圆括号“(”和“)”,方括号“[”和“]”以及花括号与“{”和“}”,且这三种括号可按任意的次序嵌套试用,如(.. .[.. .{.. .}.. .[.. .].. .].. .( .. .[.. .].. .)。试利用栈的运算编写判断给定表达式中所含括号是否正确 配对出现的算法(可设表达式已存入字符型数组中)。 8.已知Ackerman 函数定义如下:

akm(m,n)=??

?

??≠≠--=≠-=+时当时当时当0n ,0m ))1n ,m (akm ,1m (akm 0n ,0m )1,1m (akm 0m 1n

试写出递归算法。

9.设函数f(m,n)按下式定义( m,n 为)0的整数) f(m,n)=??

?≠--=++时

当时

当0n *m ))1n ,m (f ,1m (f 0n *m 1n m

试写出计算函数的递归过程。

10.设有一个背包可以放入的物品重量为S ,现有n 件物品,重量分别为w 1,w 2,.. .,w n .问能否从这n 件物品中选择若干件放入此背包,使得放入的重量之和正好为S.如果存在一种符合上述要求的选择,则称此背包问题有解(或承接为真),否则此问题无解(或结为假),试用递归和非递归两种方法设计此背包问题的算法。 11.借助栈(可用栈的基本运算)来实现单链表的逆置运算。

完整版数据结构习题集第3章栈和队列

第3章栈和队列 一、选择题 1.栈结构通常采用的两种存储结构是(A )。 A、顺序存储结构和链表存储结构 B、散列和索引方式 C、链表存储结构和数组 D、线性链表结构和非线性存储结构 2.设栈ST 用顺序存储结构表示,则栈ST 为空的条件是( B ) A、ST.top-ST.base<>0 B、ST.top-ST.base==0 C、ST.top-ST.base<>n D、ST.top-ST.base==n 3.向一个栈顶指针为HS 的链栈中插入一个s 结点时,则执行( C ) A、HS->next=s; B、s->next=HS->next;HS->next=s; C、s->next=HS;HS=s; D、s->next=HS;HS=HS->next; 4.从一个栈顶指针为HS 的链栈中删除一个结点,用x 保存被删除结点的值,则执行( C) A 、x=HS;HS=HS->next; B 、HS=HS->next;x=HS->data; C 、x=HS->data;HS=HS->next; D 、s->next=Hs;Hs=HS->next; 5.表达式a*(b+c)-d 的后缀表达式为( B ) A、abcdd+- B、abc+*d- C、abc*+d- D、-+*abcd 6.中缀表达式A-(B+C/D)*E 的后缀形式是( D ) A、AB-C+D/E* B、ABC+D/E* C、ABCD/E*+- D、ABCD/+E*- 7.一个队列的入列序列是1,2,3,4,则队列的输出序列是( B ) A、4,3,2,1 B、1,2,3,4 C、1,4,3,2 D、3,2,4,1 8.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队列为空的条件是() A、Q.rear-Q.front==n B、Q.rear-Q.front-1==n C、Q.front==Q.rear D、Q.front==Q.rear+1 9.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队列为满的条件是() A、Q.front==Q.rear B、Q.front!=Q.rear C、Q.front==(Q.rear+1)%n D、Q.front!=(Q.rear+1)%n 10.若在一个大小为6 的数组上实现循环队列,且当前rear 和front 的值分别为0 和3,当从 队列中删除一个元素,再加入两个元素后,rear 和front 的值分别为() A、1,5 B、2, 4 C、4,2 D、5,1 11.用单链表表示的链式队列的队头在链表的()位置 A、链头 B、链尾 C、链中 12.判定一个链队列Q(最多元素为n 个)为空的条件是() A、Q.front==Q.rear B、Q.front!=Q.rear C、Q.front==(Q.rear+1)%n D、Q.front!=(Q.rear+1)%n 13.在链队列Q 中,插入s 所指结点需顺序执行的指令是() A 、Q.front->next=s;f=s; B 、Q.rear->next=s;Q.rear=s;

数据结构_实验三_栈和队列及其应用

实验编号:3四川师大《数据结构》实验报告2016年10月29日 实验三栈和队列及其应用_ 一.实验目的及要求 (1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们; (2)本实验训练的要点是“栈”的观点及其典型用法; (3)掌握问题求解的状态表示及其递归算法,以及由递归程序到非递归程序的转化方法。 二.实验内容 (1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等); (2)应用栈的基本操作,实现数制转换(任意进制); (3)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列); (4)利用栈实现任一个表达式中的语法检查(括号的匹配)。 (5)利用栈实现表达式的求值。 注:(1)~(3)必做,(4)~(5)选做。 三.主要仪器设备及软件 (1)PC机 (2)Dev C++ ,Visual C++, VS2010等 四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等); A.顺序储存: 代码部分: 栈" << endl; cout << " 2.出栈" << endl; cout << " 3.判栈空" << endl; cout << " 4.返回栈顶部数据" << endl; cout << " 5.栈长" << endl; cout << " 0.退出系统" << endl;

cout << "你的选择是:" ; } 链式储存: 代码部分: 栈"<>select; switch (select){ case 0:break; case 1: cout<<"push data:"; cin>>e; if(push(L,e)){

循环练习

1.下面程序的循环次数是: int k=0; while(k<10) {if(k<1) continue; if(k==5) break; k++; } A. 5 B 6 C 4 D 死循环,不能确定循环次数 2.运行下面程序: main() { int i=10,j=0; do { j=j+i; i--; }while(i>5); printf(“%d\n”,j); } 输出结果是: A 45 B 40 C 34 D 55 3.运行下面程序 #include “stdio.h” main() { int k=0,a=1; while(k<10) { for( ; ;) { if((k%10)==0) break; else k--; } k+=11; a+=k; } printf(“%d %d\n”,k,a); } 则输出的结果是() A 21 32 B 21 33 C 11 12 D 10 11

4.以下叙述正确的是: A.do---while语句构成的循环不能用其他语句构成的循环来代替。 B.do---while语句构成的循环只能用break语句退出。 C.用do---while语句构成的循环,在while 后的表达式为非零时结束循环。 D.用do---while语句构成的循环,在while后的表达式为零时结束循环。 5.有如下程序: main() { int x=3; do{ printf(“%d”,x--); }while(!x); } 该程序的执行结果是: A 3 2 1 B 2 1 0 C 3 D 2 6.若k为整型变量,则下面while循环执行的次数为: k=10; while(k==0) k=k-1; A 0 B 1 C 10 D无限次 7.执行以下程序后,输出结果是: main() { int y=10; do { y--;}while(--y); printf(“%d”,y--); } A -1 B 1 C 8 D 0 8.求1-2+3-4+…+99-100。 9.计算1---100以内的所有含6的数的和。 10.输出所有的3位水仙花数。所谓水仙花数是指所有位的数字的立方之和等于该数,例如:153=13+33+53

数据结构:栈和队列学习资料

数据结构:栈和队列

单选题: 1.在一个具有n个单元的顺序栈中,假定以地址低端作为栈底,以top作为栈顶指针,则当做退栈处 理时,top变化为_____。 A. top不变 B. top=-n C. top=top-1 D.top=top+1 2.向顺序栈中压入元素时,是_____。 A.先移动栈顶指针,后存入元素 B.先存入元素,后移动栈顶指针 3.在一个顺序存储的循环队列中,队首指针指向队首元素的_____。 A.前一个位置 B.后一个位置 C.队首元素位置 4.若进栈序列为1,2,3,4,进栈过程中可以出栈,则_____不可能是一个出栈序列。 A.3,4,2,1 B.2,4,3,1 C.1,4,3,2 D.3,2,1,4 5.在具有n个单元的顺序存储的循环队列中,假定front和rear分别为队首指针和队尾指针,则判断队 空的条件是_____。 A.front= =rear+1 B.front+1= =rear C.front= =rear D.front= =0 6.在具有n个单元的顺序存储的循环队列中,假定front和rear分别为队首指针和队尾指针,则判断队 满的条件是_____。 A.\rear % n= =front B.(rear-1) % n= =front C.(rear-1) % n= =rear D.(rear+1) % n= =front 7.向一个栈项指针为hs的链栈中插入一个*s结点时,则执行_____。 A.hs->next=s; B.s->next=hs->next; hs->next=s; C.s->next=hs;hs=s; D.s->next=hs; hs=hs->next; 8.在一个链队列中,假定front和rear分别为队首指针和队尾指针,则进行插入*s结点的操作时应执 行_____。 A.front->next=s; front=s; B.rear->next=s; rear=s; C.front=front->next; D.front=rear->next; 9.栈的特点是_______队的特点是______ A.先进先出 B.先进后出B|A 10.栈和队列的共同点是_______。 A.都是先进后出 B.都是先进先出 C.只允许在端点处插入和删除元素 D.没有共同点 11.一个栈的进栈序列是a,b,c,d,e,则栈的不可能的输出序列是________。 A.edcba B.decba C.dceab D.abcde 12.若己知一个栈的进栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi(1top!=-1 B.st->top==-1 C.st->top!=MaxSize-1 D.st->top==MaxSize-1 18.判定一个顺序栈st(最多元素为MaxSize)为栈满的条件是_______。 A.st->top!=-1 B.st->top==-1 C.st->top!=MaxSize-1 D.st->top==MaxSize-1 19.最不适合用作链栈的链表是________。 A.只有表头指针没有表尾指针的循环双链表 B.只有表尾指针没有表头指针的循环双链表 C.只有 表尾指针没有表头指针的循环单链表 D.只有表头指针没有表尾指针的循环单链表 20.向一个栈项指针为hs的链栈中插入一个s所指结点时,则执行_______。 A.hs->next=s; B.s->next=hs->next;hs->next=s; C.s->next=hs;hs=s; D.s->next=hs;hs=hs->next;

数据结构堆栈与队列实验报告

实验二堆栈和队列 实验目的: 1.熟悉栈这种特殊线性结构的特性; 2.熟练并掌握栈在顺序存储结构和链表存储结构下的基本运算; 3.熟悉队列这种特殊线性结构的特性; 3.熟练掌握队列在链表存储结构下的基本运算。 实验原理: 堆栈顺序存储结构下的基本算法; 堆栈链式存储结构下的基本算法; 队列顺序存储结构下的基本算法; 队列链式存储结构下的基本算法; 实验内容: 第一题链式堆栈设计。要求 (1)用链式堆栈设计实现堆栈,堆栈的操作集合要求包括:初始化StackInitiate(S),非空否StackNotEmpty(S),入栈StackiPush(S,x),出栈StackPop(S,d),取栈顶数据元素StackTop(S,d); (2)设计一个主函数对链式堆栈进行测试。测试方法为:依次把数据元素1,2,3,4,5入栈,然后出栈并在屏幕上显示出栈的数据元素; (3)定义数据元素的数据类型为如下形式的结构体, Typedef struct { char taskName[10]; int taskNo; }DataType; 首先设计一个包含5个数据元素的测试数据,然后设计一个主函数对链式堆栈进行测试,测试方法为:依次吧5个数据元素入栈,然后出栈并在屏幕上显示出栈的数据元素。 第二题对顺序循环队列,常规的设计方法是使用対尾指针和对头指针,对尾指针用于指示当前的対尾位置下标,对头指针用于指示当前的対头位置下标。现要求: (1)设计一个使用对头指针和计数器的顺序循环队列抽象数据类型,其中操作包括:初始化,入队列,出队列,取对头元素和判断队列是否为空; (2)编写主函数进行测试。 程序代码: 第一题: (1)源程序"LinStack.h"如下: #define NULL 0 typedef struct snode { DataType data; struct snode *next; } LSNode; /*(1)初始化StackInitiate(LSNode ** head) */ void StackInitiate(LSNode ** head) /*初始化带头结点链式堆栈*/

三单元 循环结构练习题

第三单元循环结构练习题 选择题: 1、有以下程序执行后的输出结果是()。 main( ) { int i,s=0; for(i=1;i<10;i+=2) s+=i+1; printf("%d\n",s);} A.自然数1~9的累加和 B.自然数1~10的累加和 C.自然数1~9中的奇数之和 D.自然数1~10中的偶数之和 2、以下关于for语句的说法不正确的是()。 A. for循环只能用于循环次数已经确定的情况 B. for循环是先判断表达式,后执行循环体语句 C. for循环中,可以用break跳出循环体 D. for循环体语句中,可以保含多条语句,但要用花括号括起来 3、若i和k都是int类型变量,有以下for语句 for(i=0,k=-1;k=1;k++) printf("*****\n"); 下面关于语句执行情况的叙述中正确的是()。 A.循环体执行两次 B.循环体执行一次 C.循环体一次也不执行 D.构成无限循环 4、已知 int t=0; while(t=1){...} 则以下叙述正确的是()。 A)循环控制表达式的值为0 B)循环控制表达式的值为1 C)循环控制表达式不合法 D)以上说法都不对 5、设有以下程序段 int x=0,s=0; while(!x!=0)s+=++x; printf("%d",s); 则 A)运行程序段后输出0 B)运行程序段后输出1 C)程序段中的控制表达式是非法的 D)程序段执行无限次 6、设i,j,k均为int型变量,则执行完下面的for语句后,k的值为()。for(i=0, j=10; i<=j; i++, j- -)k=i+j; A.6 B.9 C.10 D.11 7、C语言中,break; 语句可以用于循环语句和( )语句中。 A.if B.switch C.for D.while 8、for(i=0; i<=15; i++) printf("%d", i ); 循环结束后,i 的值为()。 A.14 B.15 C.16 D.17 9、与语句“while(!x)”等价的语句是()。 A. while(x==0) B. while(x!=0) C. while(x==1) D. while(x!=1) 10、下述程序段中,while循环执行次数是()。 int k=0;

数据结构第三章栈和队列3习题

第三章栈和队列试题 一、单项选择题 1.栈的插入和删除操作在()进行。 A. 栈顶 B. 栈底 C. 任意位置 D. 指定位置 2.当利用大小为n的数组顺序存储一个栈时,假定用top==n表示栈空,则向这个栈插入一个元素时, 首先应执行()语句修改top指针。 A. top++; B. top--; C. top = 0; D. top; 3.若让元素1,2,3依次进栈,则出栈次序不可能出现()种情况。 A. 3, 2, 1 B. 2, 1, 3 C. 3, 1, 2 D. 1, 3, 2 4.在一个顺序存储的循环队列中,队头指针指向队头元素的()位置。 A. 前一个 B. 后一个 C. 当前 D. 后面 5.当利用大小为n的数组顺序存储一个队列时,该队列的最大长度为()。 A. n-2 B. n-1 C. n D. n+1 6.从一个顺序存储的循环队列中删除一个元素时,需要()。 A. 队头指针加一 B. 队头指针减一 C. 取出队头指针所指的元素 D. 取出队尾指针所指的元素 7.假定一个顺序存储的循环队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。 A. front+1 == rear B. rear+1 == front C. front == 0 D. front == rear 8.假定一个链式队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。 A. front == rear B. front != NULL C. rear != NULL D. front == NULL 9.设链式栈中结点的结构为(data, link),且top是指向栈顶的指针。若想在链式栈的栈顶插入一 个由指针s所指的结点,则应执行操作()。 A. top->link = s; B.s->link = top->link; top->link = s; C. s->link = top; top = s; D. s->link = top; top = top->link; 10.设链式栈中结点的结构为(data, link),且top是指向栈顶的指针。若想摘除链式栈的栈顶结点, 并将被摘除结点的值保存到x中,则应执行操作()。 A. x = top->data; top = top->link; B. top = top->link; x = top->data; C. x = top; top = top->link; D. x = top->data; 11.设循环队列的结构是 #define MaxSize 100 typedef int ElemType;

循环结构(While_Do循环)

四. While循环 1.While循环的格式: While <条件表达式> 循环体 Wend 说明:<条件表达式>为关系或逻辑表达式。 2.执行过程:判断条件;条件满足,执行循环体语句;再继续判断条件,继续执行循环; 直到条件不满足,结束循环。 结合下面我们熟悉的For程序,来说明: For I = 1 To 10 S = S + I Next I Print I 改用While循环表示: I = 1 ‘初值 While I<=10 ‘循环条件 S=S+I I=I+1 ‘变量自增,加步长 Wend Print S 3.While循环的说明 For循环语句必须给出初值、终值、步长值;循环条件也就给出了。 While循环语句中只给出循环条件和终值,所以一定要注意给出初值和增量。如上面程序段中的3处颜色部分语句。 例如:以下程序段循环几次,y值结果如何。 y = 2 While y < = 8 y = y + y Wend Print y 分析: 循环条件:y<=8 执行过程如下: Y=2,y<=8 满足,执行语句:y = y + y,y=4;遇到Wend返回继续判断条件。 Y=4,y<=8 满足,执行语句:y = y + y,y=8;遇到Wend返回继续判断条件。 Y=8,y<=8 满足,执行语句:y = y + y ,y=16;遇到Wend返回继续判断条件。 Y=16,y<=8 不满足,结束循环。 循环执行了3次。

五.Do循环 Do循环是在While循环基础上做了一点修改。整个格式结构和执行过程基本一样。 但增加了一种格式:条件不满足就循环,满足就结束循环。 格式1:Do While (条件) 循环体 Loop I=1 Do While I<4 S=S+1 I=I+1 Loop Print S I=1 Do Until I>=40 S=S+1 I=I+1 Loop 格式2:Do 循环体 Loop While (条件) 说明:格式1、格式2和While基本一样,格式2不同在于先执行一次循环,再判断条件是否满足。 格式3:Do Until(条件) 循环体 Loop 格式4:Do 循环体 Loop Until(条件) 说明:Until和While的不同在于条件不满足才循环。 注意:为了避免循环条件的混淆,我们一般是将Until 循环转换为While 循环做题。即将Until改为While,后面的条件改取相反值条件。

数据结构练习 第三章 栈和队列

数据结构练习第三章栈和队列 一、选择题 1.栈和队列的共同特点是( )。 A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 2.向顺序栈中压入新元素时,应当()。 A.先移动栈顶指针,再存入元素 B.先存入元素,再移动栈顶指针C.先后次序无关紧要 D.同时进行 3.允许对队列进行的操作有( )。 A. 对队列中的元素排序 B. 取出最近进队的元素 C. 在队头元素之前插入元素 D. 删除队头元素 4.用链接方式存储的队列,在进行插入运算时( ). A. 仅修改头指针 B. 头、尾指针都要修改 C. 仅修改尾指针 D.头、尾指针可能都要修改 5.设用链表作为栈的存储结构则退栈操作()。 A. 必须判别栈是否为满 B. 必须判别栈是否为空 C. 判别栈元素的类型 D.对栈不作任何判别 6.设指针变量front表示链式队列的队头指针,指针变量rear表示链式队列的队尾指针,指针变量s指向将要入队列的结点X,则入队列的操作序列为()。 A.front->next=s;front=s; B. s->next=rear;rear=s; C. rear->next=s;rear=s; D. s->next=front;front=s; 7.设指针变量top指向当前链式栈的栈顶,则删除栈顶元素的操作序列为()。 A.top=top+1; B. top=top-1; C. top->next=top; D. top=top->next; 8.队列是一种()的线性表。 A. 先进先出 B. 先进后出 C. 只能插入 D. 只能删除 9.设输入序列1、2、3、…、n经过栈作用后,输出序列中的第一个元素是n,则输出序列中的第i个输出元素是()。 A. n-i B. n-1-i C. n+l -i D.不能确定 10.设输入序列为1、2、3、4、5、6,则通过栈的作用后可以得到的输出序列为()。 A. 5,3,4,6,1,2 B. 3,2,5,6,4,1 C. 3,1,2,5,4,6 D. 1,5,4,6,2,3 11.队列的删除操作是在()进行。 A.队首 B.队尾 C.队前 D.队后 12.当利用大小为N 的数组顺序存储一个栈时,假定用top = = N表示栈空,则退栈时,用()语句修改top指针。 A.top++; B.top=0; C.top--; D.top=N; 13.队列的插入操作是在()进行。

数据结构栈和队列实验报告.doc

南京信息工程大学实验(实习)报告 实验(实习)名称栈和队列日期2017.11.8 得分指导老师崔萌萌 系计算机系专业软件工程年级2016 班次(1) 姓名学号 一、实验目的 1、学习栈的顺序存储和实现,会进行栈的基本操作 2、掌握递归 3、学习队列的顺序存储、链式存储,会进行队列的基本操作 4、掌握循环队列的表示和基本操作 二、实验内容 1、用栈解决以下问题: (1)对于输入的任意一个非负十进制数,显示输出与其等值的八进制数,写出程序。(2)表达式求值,写出程序。 2、用递归写出以下程序: (1)求n!。 (2)汉诺塔程序,并截图显示3、4、5个盘子的移动步骤,写出移动6个盘子的移动次数。

3、编程实现:(1)创建队列,将asdfghjkl依次入队。(2)将队列asdfghjkl依次出队。 4、编程实现创建一个最多6个元素的循环队列、将ABCDEF依次入队,判断循环队列是否队满。 三、实验步骤 1.栈的使用 1.1 用栈实现进制的转换: 代码如下: #include #include using namespace std; int main() { stack s; //栈s; int n,radix; printf("请输入要转换的十进制非负整数: "); scanf("%d",&n); printf("请输入目标进制: "); scanf("%d",&radix);

printf("转换为%d进制: ",radix); while(n) { s.push(n%radix); n /= radix; } while(!s.empty()) { //非空 printf("%d",s.top()); s.pop(); } printf("\n"); return 0; } 运行结果如下: 2.2 求表达式的值 代码如下: #include #include #include #include #define true 1 #define false 0 #define OPSETSIZE 8 typedef int Status;

while循环结构例题

引子 #include "stdio.h" main() { int i=1; for(i=1;i<=10000;i++) printf(“%d\t”,i); } 题型1 输入输出多个数据 eg1、输出1~10000之间所有的整数#include "stdio.h" main() { int i=1; while(i<=1000) {printf(“%d\t”,i); i++;} } 拓展:1、换成所有的奇数 2、换成所有的偶数 题型2 有限个数连加和连乘

eg2.1、求1+2+3+4+………+100的值 #include "stdio.h" main() { int i=1,s=0; while(i<=100) {s=s+i; i++;} printf(“%d\n”,s); } 拓展:1、求1+2+3+4+………+n的值 2、求12+22+32+………+n2的值 3、求1+1/2+1/3+………+1/n的值eg2.2、求n!的值 #include "stdio.h" main() { int i=1,n,p=1; scanf(“%d”,&n); while(i<=n) {p=p*i; i++;} printf(“%d\n”,p); }

拓展:求1!+2!+3!+………+n!的值 #include "stdio.h" main() { int i=1,n,p=1,s; scanf(“%d”,&n); while(i<=n) {p=p*i; s=s+p; i++;} printf(“%d\n”,s); } 题型3 无限个数连加 eg3、求1-1/3+1/5-1/7+………的近似值,要求精度要达到10-4 #include "stdio.h" #include "math.h" main() { float n=1,s=0,f=1,t=1; while(fabs(t)>=1e-4) {t=f/(2*n-1); s=s+t;

数据结构栈和队列习题及答案

习题三栈和队列 一单项选择题 1. 在作进栈运算时,应先判别栈是否(① ),在作退栈运算时应先判别栈是否(② )。当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为(③ )。 ①, ②: A. 空 B. 满 C. 上溢 D. 下溢 ③: A. n-1 B. n C. n+1 D. n/2 2.若已知一个栈的进栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,...,pn,若p1=3,则p2为( )。 A 可能是2 B 一定是2 C 可能是1 D 一定是1 3. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?() 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.设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出栈的顺序是s2,s3,s4, s6, s5,s1,则栈的容量至少应该是() A.2 B. 3 C. 5 D.6 5. 若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是()。 A. |top[2]-top[1]|=0 B. top[1]+1=top[2] C. top[1]+top[2]=m D. 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. 用链接方式存储的队列,在进行删除运算时()。 A. 仅修改头指针 B. 仅修改尾指针 C. 头、尾指针都要修改 D. 头、尾指针可能都要修改 9. 递归过程或函数调用时,处理参数及返回地址,要用一种称为()的数据结构。 A.队列 B.多维数组 C.栈 D. 线性表 10.设C语言数组Data[m+1]作为循环队列SQ的存储空间, front为队头指针,rear为队尾指针,则执行出队操作的语句为() A.front=front+1 B. front=(front+1)% m C.rear=(rear+1)%(m+1) D. front=(front+1)%(m+1) 11.循环队列的队满条件为 ( ) A. (sq.rear+1) % maxsize ==(sq.front+1) % maxsize; B. (sq.front+1) % maxsize ==sq.rear C. (sq.rear+1) % maxsize ==sq.front D.sq.rear ==sq.front

C语言循环结构测习题带答案

精心整理 第5章循环结构程序设计 5.1基本知识点 ?while语句的使用格式和注意事项 ?do-while语句的使用格式和注意事项 ?for语句的使用格式和注意事项 ?break和continue语句在循环语句中的应用 ? ? ? ? 1. C. A.do-while的循环体至少无条件执行一次 B.while的循环控制条件比do-while的循环控制条件严格 C.do-while允许从外部转到循环体内 D.do-while的循环体不能是复合语句 (5)以下程序段C。 intx=-1; do { x=x*x; } while(!x);

A.是死循环 B.循环执行二次 C.循环执行一次 D.有语法错误 (6)下列语句段中不是死循环的是__C__。 A.i=100; while(1) { i=i%100+1; if(i==20)break; } B.for(i=1;;i++) sum=sum+1; C. C. COUT< main() { intnum=0; while(num<=2) {

num++; cout< else ++i; }while(s<15); Cout< main() { inti,j; for(i=4;i>=1;i--) {

数据结构栈和队列

实验二栈和队列 一、实验目的 1. 掌握栈的顺序表示和实现 2. 掌握队列的链式表示和实现 二、实验内容 1. 编写一个程序实现顺序栈的各种基本运算。 2. 实现队列的链式表示和实现。 三、实验步骤 1. 初始化顺序栈 2. 插入元素 3. 删除栈顶元素 4. 取栈顶元素 5. 遍历顺序栈 6. 置空顺序栈 7. 初始化并建立链队列 8. 入链队列 9. 出链队列 10. 遍历链队列 四、实现提示 1. /*定义顺序栈的存储结构*/ typedef struct { ElemType stack[MAXNUM]; int top; }SqStack; /*初始化顺序栈函数*/ void InitStack(SqStack *p) {q=(SqStack*)malloc(sizeof(SqStack) /*申请空间*/) /*入栈函数*/ void Push(SqStack *p,ElemType x)

{if(p->toptop=p->top+1; /*栈顶+1*/ p->stack[p->top]=x; } /*数据入栈*/ } /*出栈函数*/ ElemType Pop(SqStack *p) {x=p->stack[p->top]; /*将栈顶元素赋给x*/ p->top=p->top-1; } /*栈顶-1*/ /*获取栈顶元素函数*/ ElemType GetTop(SqStack *p) { x=p->stack[p->top];} /*遍历顺序栈函数*/ void OutStack(SqStack *p) { for(i=p->top;i>=0;i--) printf("第%d个数据元素是:%6d\n",i,p->stack[i]);} /*置空顺序栈函数*/ void setEmpty(SqStack *p) { p->top= -1;} 2. /*定义链队列*/ typedef struct Qnode { ElemType data; struct Qnode *next; }Qnodetype; typedef struct { Qnodetype *front; Qnodetype *rear; }Lqueue; /*初始化并建立链队列函数*/ void creat(Lqueue *q)

数据结构栈和队列实验报告

《数据结构》课程实验报告 实验名称栈和队列实验序号实验日期 姓名院系班级学号 专业指导教师成绩 教师评语 一、实验目的和要求 (1)理解栈和队列的特征以及它们之间的差异,知道在何时使用那种数据结构。 (2)重点掌握在顺序栈上和链栈上实现栈的基本运算算法,注意栈满和栈空的条件。 (3)重点掌握在顺序队上和链队上实现队列的基本运算算法,注意循环队队列满和队空的条件。 (4)灵活运用栈和队列这两种数据结构解决一些综合应用问题。 二、实验项目摘要 编写一个程序algo3-1.cpp,实现顺序栈的各种基本运算,并在此基础上设计一个主程序并完成如下功能:(1)初始化栈s; (2)判断栈s是否非空; (3)依次进栈元素a,b,c,d,e; (4)判断栈s是否非空; (5)输出栈长度; (6)输出从栈顶到栈底元素; (7)输出出栈序列; (8)判断栈s是否非空; (9)释放栈。 编写一个程序algo3-3.cpp,实现顺序环形队列的各种基本运算,并在此基础上设计一个主程序并完成如下功能: (1)初始化队列q; (2)判断队列q是否非空; (3)依次进队列a,b,c; (4)出队一个元素,输出该元素; (5)输出队列q的元素个数; (6)依次进队列元素d,e,f; (7)输出队列q的元素个数; (8)输出出队序列; (9)释放队列。

三、实验预习内容 栈的顺序存储结构及其基本运算实现(初始化栈,销毁栈,求栈的长度,判断栈是否为空,进栈,取栈顶元素,显示栈中元素) 队列的顺序存储结构及其基本运算实现(初始化队列,销毁队列,判断队列是否为空,入队列,出队列) 三、实验结果与分析 3-1 #define maxsize 100 #include #include using namespace std; typedef char ElemType; typedef struct { ElemType data[maxsize]; int top; } SqStack; void InitStack(SqStack * &s) { s=(SqStack *)malloc(sizeof(SqStack)); s->top=-1; } int StackEmpty(SqStack *s) { return(s->top==-1); } int Push(SqStack *&s,ElemType e) { if(s->top==maxsize-1) return 0; s->top++; s->data[s->top]=e; return 1; } int Pop(SqStack *&s,ElemType &e) { if(s->top==-1) return 0; e=s->data[s->top];

while循环练习

一、选择题 1.设有程序段 int k=10; while(k=0)k=k-1; 这下面描述中正确的是_________. a)while循环执行10次 b)循环是无限循环 c)循环体语句以此也不执行 d)循环体语句执行一次 a)E==0 b)E!=1 c)E!=0 d)E==1 2.语句while(!E);中的表达式!E等价于________. 3.下面程序段的运行结果是__________. int n=0; while(n++<=2);printf("%d",n); a)2 b)3 c)4 d)有语法错 4.下面程序的运行结果是____. #include main() { int num=0; while(num<=2) { num++; printf("%d\n",num); } } a)1 b)1 c)1 d)1 2 2 2 3 3 4 二、编程计算 1、求1~100中所有偶数的和。 2、下面程序的功能是输出1至100之间每位数的乘积大于每位数的和的数。 3、计算并输出1-3+5-7+……-99+101的值。

三、写一个小型计算器。 界面如下: 要求: 1.有简单运算选择界面 2.采用循环实现菜单显示 3.采用switch结构实现菜单的选择 4.运算对象为两个操作数,从键盘输入 5.运算结果输出 1、计算下列式子的值: (1)1+3+……+99 (2)1+2+4+8+……+128+256 2、输入一个整数,计算它各位上数字的和。(注意:是任意位的整数) 3、输入一整数A,判断它是否质数。(提示:若从2到A的平方根的范围内,没有一个数能整除A,则A是质数。) 4、求两个数的最小公倍数和最大公约数。(提示:公约数一定小于等于两数中的小数,且能整除两数中的大数。公倍数一定大于等于两数中的大数,且是大数的倍数,又能给两数中的小数整除。) 5、编写一个译码程序,把一个英语句子译成数字代码。译码规则是以数字1代替字母A,数字2代替字母B,……,26代替字母Z,如遇空格则打印一个星号…*?,英文句子以….…结束。 6、求水仙花数。所谓水仙花数,是指一个三位数abc,如果满足a^3+b^3+c^3=abc,则abc 是水仙花数。 7、“百钱买百鸡”是我国古代的著名数学题。题目这样描述:3文钱可以买1只公鸡,2文钱可以买一只母鸡,1文钱可以买3只小鸡。用100文钱买100只鸡,那么各有公鸡、母鸡、小鸡多少只?与之相似,有"鸡兔同笼"问题。

C语言循环结构练习题带答案

第5章循环结构程序设计 练习题 1. 单项选择题 (1)语句while (!e);中的条件!e等价于 A 。 A. e==0 B. e!=1 C. e!=0 D. ~e (2)下面有关for循环的正确描述是 D 。 A. for循环只能用于循环次数已经确定的情况 B. for循环是先执行循环体语句,后判定表达式 C. 在for循环中,不能用break语句跳出循环体 D. for循环体语句中,可以包含多条语句,但要用花括号括起来 (3)C语言中 D 。 A. 不能使用do-while语句构成的循环 B. do-while语句构成的循环必须用break语句才能退出 C. do-while语句构成的循环,当while语句中的表达式值为非零时结束循环 D. do-while语句构成的循环,当while语句中的表达式值为零时结束循环 (4)C语言中while和do-while循环的主要区别是 A 。 A. do-while的循环体至少无条件执行一次 B. while的循环控制条件比do-while的循环控制条件严格 C. do-while允许从外部转到循环体内 D. do-while的循环体不能是复合语句 (5)以下程序段 C 。 int x=-1; do { x=x*x; } while (!x); A. 是死循环 B. 循环执行二次 C. 循环执行一次 D. 有语法错误 (6)下列语句段中不是死循环的是__C__。

第5章循环结构程序设计35 A. i=100; while (1) { i=i%100+1; if (i==20) break; } B.for (i=1;;i++) sum=sum+1; C.k=0; do { ++k; } while (k<=0); D.s=3379; while (s++%2+3%2) s++; (7)与以下程序段等价的是__A__。 while (a) { if (b) continue; c; } A. while (a) B. while (c) { if (!b) c; } { if (!b) break; c; } C. while (c) D. while (a) { if (b) c; } { if (b) break; c; } (8)以下程序的输出结果是_B___。 #include main() { int i; for (i=4;i<=10;i++) { if (i%3==0) continue; COUT<

相关文档
最新文档