数据结构-第三次作业(答案)

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

第三次作业
第三章栈和队列
一、选择题
1. 若一个栈的输入序列为1,2,3,…,n,输出序列的第一个元素是i,则第j个输出元素是
( D )。

A. i-j-1
B. i-j
C. j-i+1
D. 不确定的
2. 若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)
栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是( AD )。

A. |top[2]-top[1]|=0
B. top[1]+1=top[2]
C. top[1]+top[2]=m
D.
top[1]=top[2]
3. 栈在( D )中应用。

A. 递归调用
B. 子程序调用
C. 表达式求值
D. A,B,C
4. 表达式3* 2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为( D ),其
中^为乘幂。

A. 3,2,4,1,1;(*^(+*-
B. 3,2,8;(*^-
C. 3,2,4,2,2;(*^(-
D. 3,2,8;
(*^(-
5. 用链接方式存储的队列,在进行删除运算时( D )。

A. 仅修改头指针
B. 仅修改尾指针
C. 头、尾指针都要修改
D. 头、尾指针
可能都要修改
6. 假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中
的元素个数为( A )。

A.(rear-front+m)%m B.rear-front+1 C.(front-rear+m)%m D.(rear-front)%m
7. 栈和队列的共同点是( C )。

A. 都是先进先出
B. 都是先进后出
C. 只允许在端点处插入和删除元素
D. 没有共同点
8. 设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元
素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1则栈S的容量至少应
该是( C )。

A. 6 B. 4 C. 3 D. 2
二、判断题
1.消除递归不一定需要使用栈,此说法(√)
2. 栈是实现过程和函数等子程序所必需的结构。

(√)
3.栈与队列是一种特殊操作的线性表。

(√)
4.栈和队列都是限制存取点的线性结构。

(√)
5. 任何一个递归过程都可以转换成非递归过程。

(√)
6.在用循环单链表表示的链式队列中,可以不设队头指针,仅在链尾设置队尾指针。

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

(X )
8.若让元素1, 2, 3依次进栈,则出栈次序1, 3, 2是不可能出现的情况。

(X )
9.链式栈与顺序栈相比,一个明显的优点是通常不会出现栈满的情况。

(√)
10.每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列。

(√)
三、填空
1. 向一个循环队列中插入元素时,需要首先移动__队尾指针______,然后再向所指位置写入新插入的元素。

2. 设循环队列Q的队头和队尾指针分别为front和rear,则判断队空的条件为__front==rear______。

3. 假定front和rear分别为一个链式队列的队头和队尾指针,则该链式队列中只有一个结点的条件为__ front==rear&&front!=NULL_______。

4. 在向一个链式栈插入一个新结点时,首先把栈顶指针中存放的结点地址赋给新结点的指针域,然后把新结点的存储位置赋给____栈顶指针____。

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

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

7. 设有一个顺序栈S,元素s1, s2, s3, s4, s5, s6依次进栈,如果6个元素的出栈顺序为s2, s3, s4, s6, s5, s1,则顺序栈的容量至少应为____3____。

8. 向一个栈顶指针为top的链式栈中插入一个新结点*p时,应执行__p->link=top______和_top=p_______操作。

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

10. 后缀表达式“4 5 * 3 2 + -”的值为__15______。

四、应用题
1. 写出下列程序段的输出结果:
void main( ) {
queue Q; char x = 'e', y = 'c';
Q.EnQueue ( 'h' ); Q.EnQueue ( 'r' ); Q.EnQueue ( y );
Q.DeQueue(Q,x); Q.EnQueue ( x ); Q.DeQueue ( x );
Q.EnQueue ( 'a' );
while (!Q.IsEmpty ( ) ) { Q.DeQueue ( y ); cout << y; }
cout << y << endl;
}
输出结果:_______chaa_______________
2. 写出下列程序段的输出结果:
void main( ) {
stack S; char x, y;
x = 'c'; y = 'k';
S.Push ( x ); S.Push ( 'a' ); S.Push ( y );
S.Pop ( x ); S.Push ( 't' ); S.Push ( x );
S.Pop ( x ); S.Push ( 's' );
while (!S.IsEmpty ( ) ) { S.Pop ( y ); cout << y; }
cout << y << endl;
}
输出结果:______stacc________________
3. 试画出对后缀算术表达式a b c * + d e / - 求值时运算对象栈OPND的变化。

步骤OPND 输入
1 a a
2 a,b ab
3 a,b,c abc
4 a,b*c abc*
5 a+b*c abc*+
6 a+b*c,d abc*+d
7 a+b*c,d,e abc*+de
8 a+b*c,d/e abc*+de/
9 a+b*c-d/e abc*+de/-
4. 简述下述算法功能
void unknown ( Queue &Q ) {
Stack S; int d;
while (!Q.IsEmpty ( ) )
{ Q.DeQueue ( d ); S.Push ( d ); }
while (!S.IsEmpty ( ) )
{ S.Pop ( d ); Q.EnQueue ( d ); }
}
功能是:___________颠倒队列中元素的顺序______________________________
五、算法设计题
1.双端队列(deque)是两端都可以插入与删除的顺序表。

若将一个双端队列存放于一维数组Q[m]中,两个端点设为end1和end2,并让该数组首尾相接。

试写出双端队列所用指针end1和end2的初始化条件及队空与队满条件,并编写基于此结构的相应的插入(enqueue)新元素和删除(dequeue)算法。

初始化条件end1 = end2 = 0;
队空条件end1 = end2;
队满条件( end1 + 1 ) % m = end2;
//设end1端顺时针进栈,end2端逆时针进栈
循环队列的数据结构定义:
typeded struct
{int end1, end2; //队列两端的指针
Elemtype V[m]; //存放队列元素的数组,队列最大可容纳元素个数为m
} DoubleQueue
插入函数
int EnQueue (DoubleQueue *q, int end )
{ if ((q->end1+1)%m=q->end2)
return ( FLASE); //队满,无法入队
if ( end = = 1 )
{ end1 = ( end1 + 1 ) % m; //end1端指针先进1, 再按指针进队列
q->V[q->end1] = x; //end1指向实际队头位置
return (TRUE);
}
else
{ q->V[q->end2] =x; //end2端先进队列, 指针再进1
end2 = ( end2 - 1 + m ) % m; //end2指向实际队头的下一位置
return (TRUE);
}
}
删除函数
int DeQueue ( DoubleQueue *q, int end, Elemtype *x )
{ if (q->end1=q->end2)
return ( Flase); //队空,无法出队
if ( end = = 1 )
{ *x= q->V[q->end1]; //先保存原队头元素的值, end1端指针退1
q->end1 = ( q->end1 + m - 1 ) % m;
}
else
{ q->end2 = ( q->end2 + 1 ) % m;
*x = q->V[q->end2]; //end2端指针先退1。

再保存原队头元素的值
}
}
2.用俩个栈实现队列。

int enqueue(stack s1,elemtp x)
{if(top1==n && !Sempty(s2))
{printf(“栈满”);return(0);}
if(top1==n && Sempty(s2))
{while(!Sempty(s1)) {POP(s1,x);PUSH(s2,x);}
PUSH(s1,x); return(1);
}
void dequeue(stack s2,s1)
{if(!Sempty(s2))
{POP(s2,x); printf(“出队元素为”,x); }
else
if(Sempty(s1)) {printf(“队列空”);exit(0);}
else
{while(!Sempty(s1)) {POP(s1,x);PUSH(s2,x);}
POP(s2,x);
printf(“出队元素”,x);
}
}
int queue_empty()
//本算法判用栈s1和s2模拟的队列是否为空。

{if(Sempty(s1)&&Sempty(s2)) return(1);//队列空。

else return(0); //队列不空。

}
3. 用递归颠倒一个栈。

例如输入栈{1, 2, 3, 4, 5},1在栈顶。

颠倒之后的栈为{5, 4, 3, 2, 1},
5处在栈顶。

1.#include <iostream>
2.#include <stack>
ing namespace std;
4.
5.void PushToButtom(stack<int> *s,int o)
6.{
7.if(s->empty())
8. {
9. s->push(o);
10.return;
11. }
12.else
13. {
14.int o2 = s->top();
15. s->pop();
16. PushToButtom(s,o);
17. s->push(o2);
18. }
19.}
20.
21.void Reverse(stack<int> *s)
22.{
23.if(s->size() == 1) return ;
24.int o = s->top();
25. s->pop();
26. Reverse(s);
27. PushToButtom(s,o);
28.}
29.
30.int main()
31.{
32. stack<int> *s =new stack<int>;
33. s->push(1);
34. s->push(2);
35. s->push(3);
36. s->push(4);
37. s->push(5);
38.
39. Reverse(s);
40.while(!s->empty())
41. {
42. cout << s->top() << " ";
43. s->pop();
44. }
45.
46.}。

相关文档
最新文档