数据结构习题(2)
学号________ 姓名_______ 课堂号(A:周一课堂,B:周二课堂)
1.选择题
1)数据入栈顺序是a,b,c,d,e,则不可能的出栈序列是( B )
A.edcba B.dceab C.decba D.abcde
2)判断一个栈S(最多有n个元素)为空的条件是( A )
p==S.ba p!=S.ba
p-S.ba==n p-S.ba!=n
3)判断一个栈S(最多有n个元素)为满的条件是( C )
p==S.ba p!=S.ba
p-S.ba==n p-S.ba!=n
4)判断一个循环队列Q(最多有n个元素)为空的条件是 ( A )
A.Q.rear==Q.front B. Q.rear=(Q.front+1)%n
C. Q.rear=(Q.front-1)%n D. Q.rear-Q.front=1
5)判断一个循环队列Q(最多有n个元素)为满的条件是 ( C )emergency是什么意思
ar==Q.front B. Q.rear=(Q.front+1)%n
jbcC.Q.front=(Q.rear+1)%n D. Q.front= (Q.rear-1)%n
6)表达式a*(b+c)-d的后缀表达式是( B )。
A.abcd*+- B. abc+*d- C. abc*+d- D. -+*abcd
7)设计一个判别表达式中左,右括号是否配对出现的算法,采用( D )数据结构最佳。
A.线性表的顺序存储结构 B. 队列
C. 线性表的链式存储结构 D. 栈
8)用链接方式存储的队列,在进行删除运算时( D )。
A. 仅修改头指针 B. 仅修改尾指针
C. 头、尾指针都要修改 D. 头、尾指针可能都要修改
9)假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为( A )。
A.(rear-front+m)%m B.rear-front+1
C.(front-rear+m)%m D.(rear-front)%m
10)若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为1和4,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?( D )
A. 1和 5 B. 2和4 C. 4和2 D. 3和5
2. 填空题
1)栈是__操作受限_____的线性表,其运算遵循__后进先出____的原则。
2)一个栈的输入序列是:1,2,3则不可能的栈输出序列是___3 1 2___。
treated3)队列的特点是__先进先出____。
4)栈的数据插入和删除操作分别称为__Push(入栈)_______和___Pop(出栈)_____。
5)9+(24/6+3*2)/5的后缀表达式为_9246/32*+5/+_____。
3.分析题
1)如果进栈的数据序列为A,B,C,D,则写出所有可能的出栈序列。
ABCD、ABDC、ACBD、ACDB、ADCB、BACD、BADC、BCAD、BCDA、BDCA、CBAD、CBDA、CDBA、DCBA。
4. 程序填空题
1)Status Pop(SqStack *S,SElemType *e)
{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
if((*S).top==(*S).ba)
return ERROR;
*e=__*--(*S).top___;
return OK;
}
2)Status EnQueue(LinkQueue *Q,QElemType e)
{ /* 插入元素e为Q的新的队尾元素 */
QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
if(!p) /* 存储分配失败 */
exit(OVERFLOW);
p->data=e;
p->next=NULL;
____(*Q).rear->next__________=p;
(*Q).rear=p;
return OK;
}
3)int QueueLength(SqQueue Q) //循环队列
{ /* 返回Q的元素个数,即队列的长度 */
return ____(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE_______________;
}
4)Status EnQueue(SqQueue *Q,QElemType e)
{ /* 插入元素e为Q的新的队尾元素 */
if(((*Q).rear+1)%MAXQSIZE==(*Q).front) /* 队列满 */
return ERROR;
___(*Q).ba[(*Q).rear]______=e;
mutex (*Q).rear=((*Q).rear+1)%MAXQSIZE;
return OK;
}
5. 编程题
1)已知单链表La和Lb,试编写程序实现将单链表La第i个元素起的共k个元素删除并插入到单链表Lb的第j个元素之前。
【参考代码】
/* main2-2.c 检验bo2-2.c的主程序(与main2-1.c很像) */
#include"c1.h"
typedef int ElemType;
#include"c2-2.h" /* 与main2-1.c不同 */
#include"bo2-2.c" /* 与main2-1.c不同 */
Status comp(ElemType c1,ElemType c2)
{ /* 数据元素判定函数(相等为TRUE,否则为FALSE) */
if(c1==c2)
insist的用法 return TRUE;
el
return FALSE;
}
void visit(ElemType c) /* 与main2-1.c不同 */
{山寨大黄鸭
printf("%d ",c);
academician
}
void Merge(LinkList La,int i,int k,LinkList Lb,int j)
{
int len_La,len_Lb;
ElemType e;
特洛伊战争 int ll;
len_La=ListLength(La);
len_Lb=ListLength(Lb);
if(i<1 || i>len_La || i+k>len_La || j<1 || j>len_Lb)
{
printf("插入位置错误,退出");
return;
}
for(ll=1;ll<=k;ll++)
{
ListDelete(La,i,&e);
ListInrt(Lb,j,e);
}
printf("\n合并后Lb的元素:");
}
void main()
{
LinkList La,Lb;
ElemType e;
int j,k;
InitList(&La);
InitList(&Lb);
for(j=1;j<=7;j++)
ListInrt(La,1,j);
printf("\n链表La:");
ListTraver(La,visit);
for(j=10;j>=8;j--)
ListInrt(Lb,1,j);
printf("\n链表Lb:");
广州室内设计学校
ListTraver(Lb,visit);
Merge(La,2,3,Lb,2);
ListTraver(Lb,visit);
DestroyList(&La);
DestroyList(&Lb);
杯子的英文 }