第三次数据结构作业20101029
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三次作业
第三章栈和队列
一、选择题
1. 若一个栈的输入序列为1,2,3,…,n,输出序列的第一个元素是i,则第j个输出元素是()。
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],则栈满的条件是()。
A. |top[2]-top[1]|=0
B. top[1]+1=top[2]
C. top[1]+top[2]=m
D.
top[1]=top[2]
3. 栈在()中应用。
A. 递归调用
B. 子程序调用
C. 表达式求值
D. A,B,C
4. 表达式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;
(*^(-
5. 用链接方式存储的队列,在进行删除运算时()。
A. 仅修改头指针
B. 仅修改尾指针
C. 头、尾指针都要修改
D. 头、尾指针
可能都要修改
6. 假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中
的元素个数为()。
A.(rear-front+m)%m B.rear-front+1 C.(front-rear+m)%m D.(rear-front)%m
7. 栈和队列的共同点是()。
A. 都是先进先出
B. 都是先进后出
C. 只允许在端点处插入和删除元素
D. 没有共同点
8. 设栈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. 2
二、应用题
24. 有字符串次序为3*-y-a/y^2,利用栈,给出将次序改为3y-*ay2^/-的操作步骤。(可用X代表扫描该字符串过程中顺序取一个字符进栈的操作,用S代表从栈中取出一个字符加入到新字符串尾的出栈操作。例如,ABC变为BCA的操作步骤为XXSXSS)
【东北大学2001 一、4 ( 4分)】
24、XSXXXSSSXXSXXSXXSSSS
2. 有两个栈s1和s2共享存储空间c[1,m],其中一个栈底设在c[1]处,另一个栈底设在c[m0] 处,分别编写s1和s2的进栈push( i,x)、退栈pop(i)和设置栈空setnull(i)的函数,其中i=1,2。注意:仅当整个空间c[1,m0]占满时才产生上溢。
解:该共享栈的结构如图2.3所示,两栈的最多元素个数为m0, top1是栈1的栈指针,
top2 是栈2的栈指针,当top2=top1+1时出现上溢出,当top1=0时栈1出现下溢出,当top2=m0+1时栈2出现下溢出。根据上述原理得到如下
函数:
top1 top2
c的元素序号1 2 …….. n …….. m0-1 m0
a1 a2 …… a n ………. bm ……… b2 b1
栈1底栈1顶栈2顶栈2底
图2.3 共享栈
/*top1,top2 和m0均为已赋初值的int型全局变量*/
void push(x,i)
int x,I
{
if (top1==top2-1) printf("上溢出!\n");
else
if(i==1)/*对第一个栈进行入栈操作*/
{
top1++; c[top1]=x;
else /*对第二个栈进行入栈操作*/
{
top2--; c[top2]=x;
}
}
/*函数pop*/
void pop(i)
int i ;
{
if (i ==1 )/*对第一个栈进行出栈操作*/
if(top1==0)printf("栈1下溢出!\n");
else
{
pop=c[top1]; top1--;
}
else /*对第二个栈进行出栈操作*/
if (top2==m0+1) printf("栈2下溢出!\n");
else
{
pop=c[top2];top2++;
}
}
/*函数setnull*/
setnull(i)
int i ;
{
if(i ==1 )top1=0;
else top2=m0+1;
}
#define m0 100 /*m0为算术表达式中最多字符个数*/ correct(exp,tag)
charexp[m0];int tag;
{
charst[m0]; int top=0,i=1;
tag=1;
while(i<=m0&&tag)
{ if(exp[i]==‘(’||exp[i]==‘[’||exp[i]==‘{’) /*此时入栈*/ {top++;st[top]=exp[i];}
if(exp[i]==‘)’)
if(st[top]==‘(’) top- -; else tag=0;