第三章栈和队列习题答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
typedef char ElemType;
Status AllBrackets_Test(Sqlist L){
//判别表达式中三种括号是否匹配
ElemType *p; InitStack(s);
for(p=L.elem; p<p+L.length; p++)
if(*p==‘(’||*p==‘[’||*p==‘{’) push(s,*p); else if(*p==‘)’||*p==‘]’||*p==‘}’){
free(p); return OK;
} //DeCiQueue
14
Status DeCiQueue(CiLQueue &Q, int &x){
//出队:从循环链表表示的队列Q头部删除元素x
if(Q==Q->next) return ERROR;
//队列空
p=Q->next->next; x=p->data; Q->next->next=p->next; if(p==Q) Q=p->next; // 当队列Q只有一个元素时
} //for
if(!StackEmpty(s)) return ERROR;
return OK; } //AllBrackets_Test
10
4、假设以带头结点的循环链表表示队列,并 且只设一个指针指向队尾元素结点(注意不 设头指针),试编写相应的队列初始化、入 队列和出队列的算法。
11
typedef struct QNode { Elemype data; struct QNode *next;
//注意此时的栈满条件
if(i==0) *tws.top[0]++=x; else if(i==1) *tws.top[1]--=x; else return ERROR; return OK;
} //push 4
Status pop(DStack &tws, int i, Elemtype &x) //x出栈, i=0表示低端栈,i=1表示高端栈 {
} //EnCyQueue
17
Status DeCyQueue(CiQueue &Q, int &x){
//带length域的循环队列出队算法
if( Q.length==0 ) return INFEASIBLE; head=( Q.rear-
Q.length+1+MAXQSIZE)%MAXQSIZE; x=Q.base[head]; Q.length--; } //DeCyQueue
22
void GetFib_CyQueue(int k, unsigned long max){
//求k阶斐波那契序列的前n+1项 InitCyQueue(&Q);//其MAXSIZE设置为k for(i=0;i<k-1;i++) Q.base[i]=0; 或 EnQueue(Q,0); Q.base[k-1]=1; 或EnQueue(Q,1); //前k项赋初值
if(StackEmpty(s)) return ERROR;
pop(s,c);
if(*p==‘)’&&c!=‘(’ ) return ERROR; if(*p==‘]’&&c!=‘[’ ) return ERROR; if(*p=='}'&&c!='{‘ ) return ERROR;
} //必须与当前栈顶括号匹配
Push(S,c);EnQueue(Q,c); }
//同时使用栈和队列两种结构
while(!StackEmpty(S)) { Pop(S,a); DeQueue(Q,b)); if(a!=b) return FALSE; }
return TRUE; } //Palindrome_Test
20
Status Palindrome_Test( ){
} //Palindrome_Test
21
*7、试利用循环队列编写求k阶斐波那契序列 中前n+1项(f0,f1,···,fn)算法。要求满足: fn≤max而fn+1>max,其中max为某个约定的常 数。(注意:本题所用循环队列的容量设为k, 在算法执行结束时,留在循环队列中的元素 应是所求k阶斐波那契序列的最后k项fn-k+1, fnk+2, ···, fn )
//判别输入的字符串是否回文,是则返回TRUE,否则返 回FALSE
InitStack(S);InitQueue(Q); //初始化栈S和队列Q while((c=getchar( )!='@'){
Push(S,c);EnQueue(Q,c); }
//同时使用栈和队列两种结构百度文库
while(!StackEmpty(S)) { Pop(S,a); DeQueue(Q,b)); if(a==b) return TRUE; }
# define STACKSIZE 100
typedef struct{ Elemtype *base[2]; //两个栈底位置 Elemtype *top[2]; // 栈顶指针
int stacksize; //当前已分配的存储空间
} DStack; //双向栈类型
2
Status Init_Stack(DStack &tws){
第三章 栈和队列
1
1、假设以顺序存储结构实现一个双向栈,即在一组
连续的存储空间中存在两个栈,它们的栈底分别设在 该连续空间两端。试编写实现该双向栈tws的3个操作: 初始化IniStack(tws)、入栈(Push(tws, i, x)和出栈 Pop(tws, i)的算法,其中i为0或1,用以指示设在存储 空间两端的两个栈。
free(p); return OK;
} //DeCiQueue
15
5、假设循环队列定义为:以域变量rear和 length分别指示循环队列中队尾元素位置和内 含元素的个数。试给出此循环队列的队满和 队空条件,并写现相应的入队列和出队列的 算法(在出队列的算法中要返回队头元素位 置)
#define MAXQSIZE 100
typedef struct { int rear; //队尾指针 int lengty; //队列的长度(元素个数) ElemeType base[MAXQSIZE]; //队列元素数 组开始地址
}CyQueue; 16
Status EnCyQueue(CyQueue &Q, int x){ //带length域的循环队列入队算法 if( Q.length==MAXQSIZE ) return OVERFLOW; Q.rear=(Q.rear+1)%MAXQSIZE; Q.base[Q.rear]=x; Q.length++; return OK;
tws.stacksize=STACKSIZE; return OK;
} //Init_Stack
3
Status push(DStack &tws, int i, Elemtype x){
//x入栈, i=0表示低端栈, i=1表示高端栈
if(tws.top[0]>tws.top[1])
return OVERFLOW;
18
6、假设称正读和反读都相同的字符序列为 “回文”。试写一个算法判别读入的一个以 ‘@’为结束符的字符序列是否“回文”。
19
Status Palindrome_Test( ){
//判别输入的字符串是否回文,是则返回TRUE,否则返 回FALSE
InitStack(S);InitQueue(Q); //初始化栈S和队列Q while((c=getchar( )!='@'){
{ InitStack(s);
while((e=getchar( ))!=‘&’ && e!=‘@’)
push(s,e);
while((e=getchar( ))!=‘@’){
if(StackEmpty(s)) return FALSE;
pop(s,c);
if(e!=c) return FALSE;}
if(!StackEmpty(s)) return FALSE;
return TRUR;
} //IsReverse
8
3、假设一个算术表达式中可以包含3种括号: 圆括号‘(’和‘)’,方括号 ‘[’和‘]’ ,花括号 ‘{’和‘}’,且这3 种括号可按任意的次序嵌 套使用。编写判别给定表达式中所含括号是否 正确配对出现的算法(已知表达式已存入数据 元素为字符的顺序表中)。
if(tws.top[i]==tws.base[i])
return OVERFLOW; if(i==0) x=*--tws.top[0]; else if(i==1) x=*++tws.top[1];}
else return ERROR;
return OK;
} //pop
5
2、试写一个算法,识别依次读入的一个以 @为结束符的字符序列是否为形如: 序列1&序列2 模式的字符序列。其中序列1和序列2都不含 字符&,且序列2是序列1的逆序列。
return OK; }
13
Status DeCiQueue(CiLQueue &Q, int &x){ //出队:从循环链表表示的队列Q头部删除元素x
if(Q==Q->next) return ERROR; //队列空
p=Q->next->next; x=p->data; Q->next->next=p->next;
} CiLNode, CiLQueue;
Status InitCiQueue(CiLQueue &Q){ //初始化循环链表表示的队列Q Q=(CiLNode*)malloc(sizeof(CiLNode)); if(!Q) exit(OVERFLOW); Q->next=Q; return OK
} //InitCiQueue
s1=sum; i++; //求第i项的值 ,置下一个i值
}
} /*GetFib_CyQueue*/
23
for(i=0;i<k;i++) printf("%d ",Q.base[i]);//输出前k项值 i=k;s1=1; //从第k+1项开始计算
while(s1<=max)
{printf("%u ",s1);
m=i%k; Q.base[m]=s1; //值存入队列中并取代已无用的第一项
sum=0;
for(j=0;j<k;j++) sum+=Q.base[(m+j)%k];
12
Status EnCiQueue(CiLQueue &Q, ElemType x){ //进队:把元素x插入循环链表表示的队列Q,Q指向队 尾元素,Q->next指向头结点,Q->next->next指向队 首元素
p=(CiLNode*)malloc(sizeof(CiLNode));
if(!p) exit(OVERFLOW); p->data=x; p->next=Q->next; //直接把p加在Q之后 Q->next=p; Q=p; //修改尾指针
6
Status IsReverse( )
//判断输入的字符串中‘&’前和‘&’后部分 是否为逆串,是则返回TRUR,否则返回FALSE
{ InitStack(s);
while((e=getchar( ))!=‘&’)
push(s,e);
while((e=getchar( ))!=‘@’){
if(StackEmpty(s)) return FALSE;
//初始化一个双向栈tws
tws.base[0]
=(Elemtype*)malloc(STACKSIZE*
sizeof(Elemtype)); tws.base[1]=tws.base[0]+STACKSIZE; tws.top[0]=tws.base[0]; tws.top[1]=tws.base[1];
pop(s,c);
if(e!=c) return FALSE;}
if(!StackEmpty(s)) return FALSE;
return TRUR;
} //IsReverse
7
Status IsReverse( )
//判断输入的字符串中‘&’前和‘&’后部分 是否为逆串,是则返回TRUR,否则返回FALSE
相关文档
最新文档