第三、四章 栈和队列、串答案[1]

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第三章栈和队列答案

一、基础知识题

1、单选题

(1)栈的插入和删除操作在 A 进行。

A.栈顶B.栈底C.任意位置D.指定位置

(2)当利用大小为n的数组顺序存储一个栈时,假定用top= =n表示栈空,则向这个栈插入一个元素时首先应执行 B 语句修改top指针。

A.top++ B.top-- C.top=0 D.top

(3)若让元素1,2,3依次进栈,则出栈次序不可能出现 C 种情况。

A.3,2,1 B.2,1,3 C.3,1,2 D.1,3,2

(4)在一个顺序存储的循环队列中,队头指针指向队头元素的 A 位置。

A.前一个B.后一个C.当前D.后面

(5)当利用大小为n的数组顺序存储一个队列时,该队列的最大长度为 B 。

A.n-2 B.n-1 C.n D.n+1

(6)假定一个不带表头结点链式队列的队头和队尾指针分别为front和rear,则判断队空的条件为 D 。

A.front = = rear B.front ! = NULL

C.rear! = NULL D.front = = NULL

2、填空题

(1)队列的插入操作在队尾进行,删除操作在队头进行。

(2)栈又称为后进先出的表,队列又称为先进后出的表。

(3)向一个顺序栈插入一个元素时,首先使栈顶指针后移一个位置,然后把待插入元素写入到这个位置上。

(4)从一个栈删除一个元素时,需要前移一位栈顶指针。

(5)在一个循环队列Q中,判断队空的条件为Q.front = =Q. rear ,判断队满的条件为Q. rear+1)% MaxSize+1= =Q. front 。

(6)在一个顺序栈中,若栈顶指针等于-1 ,则为空栈;若栈顶指针等于MaxSize-1 ,则为满栈。

(7)向一个链式栈插入一个新结点时,首先把栈顶指针的值赋给新结点的指针域,然后把新结点的存储位置赋给栈顶指针。

(8)向一个循环队列中插入一个元素时,需要首先移动队尾指针,然后再向所指位置写入新插入的元素。

(9)当用长度为n的数组顺序存储一个栈时,若用top= =n表示栈空,则表示栈满的条件为top=0 。

(10)向一个栈顶指针为top的链式栈中插入一个新结点* p时,应执行p->next=top 和top=p 的操作。

(11)从一个栈顶指针为top的非空链式栈中删除结点,并不需要返回栈顶的值和回收结点时应执行top= top->next 的操作。

(12)中缀表达式3*(x+2)-5所对应的后缀表达式为 3 x 2+ * 5 - 。

(13)后缀表达式“45*32+-”的值为15 。

(14)设一个顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素的出栈顺序为s2,s3,s4,s6,s5,s1,则顺序栈的容量至少为多少? 3

二、算法设计题

1、试写一个判断表达式中开、闭括号是否配对出现的算法。

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

void InitCiQueue(CiQueue &Q)//初始化循环链表表示的队列Q

{

Q=(CiLNode*)malloc(sizeof(CiLNode));

Q->next=Q;

}//InitCiQueue

void EnCiQueue(CiQueue &Q,int x)//把元素x插入循环链表表示的队列Q,Q指向队尾元素,Q->next指向头结点,Q->next->next指向队头元素

{

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

p->data=x;

p->next=Q->next; //直接把p加在Q的后面

Q->next=p;

Q=p; //修改尾指针

}

Status DeCiQueue(CiQueue &Q,int x)//从循环链表表示的队列Q头部删除元素x {

if(Q==Q->next) return INFEASIBLE; //队列已空

p=Q->next->next;

x=p->data;

Q->next->next=p->next;

free(p);

return OK;

}//DeCiQueue

第四章串

一算法设计题

1、编写对串求逆的递推算法。

void String_Reverse(Stringtype s,Stringtype &r)//求s的逆串r

{

StrAssign(r,''); //初始化r为空串

for(i=Strlen(s);i;i--)

{

StrAssign(c,SubString(s,i,1));

StrAssign(r,Concat(r,c)); //把s的字符从后往前添加到r中}

}//String_Reverse

2、编写算法,求得所有包含在串s中而不包含在串t中的字符(s中重复的字符只选一个)构成的新串r,以及r中每个字符在s中第一次出现位置。

void String_Subtract(Stringtype s,Stringtype t,Stringtype &r)//求所有包含在串s中而t中没有的字符构成的新串r

{

StrAssign(r,'');

for(i=1;i<=Strlen(s);i++)

{

StrAssign(c,SubString(s,i,1));

for(j=1;j

if(i==j)

{

for(k=1;k<=Strlen(t)&&StrCompare(c,SubString(t,k,1));k++); //判断当前字符是否包含在t中

if(k>Strlen(t)) StrAssign(r,Concat(r,c));

}

}//for

}//String_Subtract

相关文档
最新文档