当前位置:文档之家› 第三章栈和队列习题答案

第三章栈和队列习题答案

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的逆序列。
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==‘}’){
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( ){
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;
if(StackEmpty(s)) return ERROR;
pop(s,c);
if(*p==‘)’&&c!=‘(’ ) return ERROR; if(*p==‘]’&&c!=‘[’ ) return ERROR; if(*p=='}'&&c!='{‘ ) return ERROR;
} //必须与当前栈顶括号匹配
} //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 )
pop(s,c);
if(e!=c) return FALSE;}
if(!StackEmpty(s)) return FALSE;
return TRUR;
} //IsReverse
7
Status IsReverse( )
//判断输入的字符串中‘&’前和‘&’后部分 是否为逆串,是则返回TRUR,否则返回FALSE
{ 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;}
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;
if(!StackEmpty(s)) return FALSE;
return TRUR;
} //IsReverse
8
3、假设一个算术表达式中可以包含3种括号: 圆括号‘(’和‘)’,方括号 ‘[’和‘]’ ,花括号 ‘{’和‘}’,且这3 种括号可按任意的次序嵌 套使用。编写判别给定表达式中所含括号是否 正确配对出现的算法(已知表达式已存入数据 元素为字符的顺序表中)。
} //for
if(!StackEmpty(s)) return ERROR;
return OK; } //AllBrackets_Test
10
4、假设以带头结点的循环链表表示队列,并 且只设一个指针指向队尾元素结点(注意不 设头指针),试编写相应的队列初始化、入 队列和出队列的算法。
11
typedef struct QNode { Elemype data; struct QNode *next;
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];
18
6、假设称正读和反读都相同的字符序列为 “回文”。试写一个算法判别读入的一个以 ‘@’为结束符的字符序列是否“回文”。
19
Status Palindrome_Test( ){
//判别输入的字符串是否回文,是则返回TRUE,否则返 回FALSE
InitStack(S);InitQueue(Q); //初始化栈S和队列Q while((c=getchar( )!='@'){
第三章 栈和队列
1
1、假设以顺序存储结构实现一个双向栈,即在一组
连续的存储空间中存在两个栈,它们的栈底分别设在 该连续空间两端。试编写实现该双向栈tws的3个操作: 初始化IniStack(tws)、入栈(Push(tws, i, x)和出栈 Pop(tws, i)的算法,其中i为0或1,用以指示设在存储 空间两端的两个栈。
# define STACKSIZE 100
typedef struct{ Elemtype *base[2]; //两个栈底位置 Elemtype *top[2]; // 栈顶指针
int stacksize; //当前已分配的存储空间
} DStack; //双向栈类型
2
Status Init_Stack(DStack &tws){
s1=sum; i++; //求第i项的值 ,置下一个i值
}
} /*GetFib_CyQueue*/
23
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;
//注意此时的栈满条件
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表示高端栈 {
//判别输入的字符串是否回文,是则返回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; }
//初始化一个双向栈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];
12
Status EnCiQueue(CiLQueue &Q, ElemType x){ //进队:把元素x插入循环链表表示的队列Q,Q指向队 尾元素,Q->next指向头结点,Q->next->next指向队 首元素
p=(CiLNode*)malloc(sizeof(CiLNode));
相关主题