1、数据结构课后习题解答第三章 栈与队列第三章 栈与队列 3.15 typedef struct Elemtype *base2; Elemtype *top2; BDStacktype; /双向栈类型 Status Init_Stack(BDStacktype &tws,int m)/初始化一个大小为m的双向栈twstws.base0=(Elemtype*)malloc(sizeof(Elemtype);tws.base1=tws.base0+m;tws.top0=tws.base0;tws.top1=tws.base1;return OK;/Init_Stack Status push(BDS
2、tacktype &tws,int i,Elemtype x)/x入栈,i=0表示低端栈,i=1表示高端栈if(tws.top0tws.top1) return OVERFLOW; /注意此时的栈满条件if(i=0) *tws.top0+=x;else if(i=1) *tws.top1-=x;else return ERROR;return OK;/push Status pop(BDStacktype &tws,int i,Elemtype &x)/x出栈,i=0表示低端栈,i=1表示高端栈if(i=0)if(tws.top0=tws.base0) return OVERFLOW;x=*-
3、tws.top0;else if(i=1)if(tws.top1=tws.base1) return OVERFLOW;x=*+tws.top1;else return ERROR;return OK;/pop 3.16 void Train_arrange(char *train)/这里用字符串train表示火车,H表示硬席,S表示软席p=train;q=train;InitStack(s);while(*p)if(*p=H) push(s,*p); /把H存入栈中else *(q+)=*p; /把S调到前部p+;while(!StackEmpty(s)pop(s,c);*(q+)=c; /
4、把H接在后部/Train_arrange 3.17 int IsReverse()/判断输入的字符串中&前和&后部分是否为逆串,是则返回1,否则返回0InitStack(s);while(e=getchar()!=&)push(s,e);while(e=getchar()!=)if(StackEmpty(s) return 0;pop(s,c);if(e!=c) return 0;if(!StackEmpty(s) return 0;return 1;/IsReverse 3.18 Status Bracket_Test(char *str)/判别表达式中小括号是否匹配count=0;for(
5、p=str;*p;p+)if(*p=() count+;else if(*p=) count-;if (count1)if(gx-1y=old)gx-1y=color;EnQueue(Q,x-1,y); /修改左邻点的颜色if(y1)if(gxy-1=old)gxy-1=color;EnQueue(Q,x,y-1); /修改上邻点的颜色if(xm)if(gx+1y=old)gx+1y=color;EnQueue(Q,x+1,y); /修改右邻点的颜色if(y=0) s=0;else if(m0&n=0) s=n+g(m-1,2*n);else return ERROR;return OK;/g
6、 3.25 Status F_recursive(int n,int &s)/递归算法if(n0) return ERROR;if(n=0) s=n+1;elseF_recurve(n/2,r);s=n*r;return OK;/F_recursive Status F_nonrecursive(int n,int s)/非递归算法if(n0) return ERROR;if(n=0) s=n+1;elseInitStack(s); /s的元素类型为struct int a;int b;while(n!=0)a=n;b=n/2;push(s,a,b);n=b;/whiles=1;while(!
7、StackEmpty(s)pop(s,t);s*=t.a;/whilereturn OK;/F_nonrecursive 3.26 float Sqrt_recursive(float A,float p,float e)/求平方根的递归算法if(abs(p2-A)=e)p=(p+A/p)/2;return p;/Sqrt_nonrecursive 3.27 这一题的所有算法以及栈的变化过程请参见数据结构(pascal版),作者不再详细写出. 3.28 void InitCiQueue(CiQueue &Q)/初始化循环链表表示的队列QQ=(CiLNode*)malloc(sizeof(CiL
8、Node);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头部删除元素xif(Q=Q-next) return INFEASIBLE; /队列已空p=Q-n
9、ext-next;x=p-data;Q-next-next=p-next;free(p);return OK;/DeCiQueue 3.29 Status EnCyQueue(CyQueue &Q,int x)/带tag域的循环队列入队算法if(Q.front=Q.rear&Q.tag=1) /tag域的值为0表示空,1表示满return OVERFLOW;Q.baseQ.rear=x;Q.rear=(Q.rear+1)%MAXSIZE;if(Q.front=Q.rear) Q.tag=1; /队列满/EnCyQueue Status DeCyQueue(CyQueue &Q,int &x)/
10、带tag域的循环队列出队算法if(Q.front=Q.rear&Q.tag=0) return INFEASIBLE;Q.front=(Q.front+1)%MAXSIZE;x=Q.baseQ.front;if(Q.front=Q.rear) Q.tag=1; /队列空return OK;/DeCyQueue分析:当循环队列容量较小而队列中每个元素占的空间较多时,此种表示方法可以节约较多的存储空间,较有价值. 3.30 Status EnCyQueue(CyQueue &Q,int x)/带length域的循环队列入队算法if(Q.length=MAXSIZE) return OVERFLOW
11、;Q.rear=(Q.rear+1)%MAXSIZE;Q.baseQ.rear=x;Q.length+;return OK;/EnCyQueue Status DeCyQueue(CyQueue &Q,int &x)/带length域的循环队列出队算法if(Q.length=0) return INFEASIBLE;head=(Q.rear-Q.length+1)%MAXSIZE; /详见书后注释x=Q.basehead;Q.length-;/DeCyQueue 3.31 int Palindrome_Test()/判别输入的字符串是否回文序列,是则返回1,否则返回0InitStack(S);
12、InitQueue(Q);while(c=getchar()!=)Push(S,c);EnQueue(Q,c); /同时使用栈和队列两种结构while(!StackEmpty(S)Pop(S,a);DeQueue(Q,b);if(a!=b) return ERROR;return OK;/Palindrome_Test 3.32 void GetFib_CyQueue(int k,int n)/求k阶斐波那契序列的前n+1项InitCyQueue(Q); /其MAXSIZE设置为kfor(i=0;ik-1;i+) Q.basei=0;Q.basek-1=1; /给前k项赋初值for(i=0;i
13、k;i+) printf(%d,Q.basei);for(i=k;i=n;i+)m=i%k;sum=0;for(j=0;j=avr) /根据x的值决定插入在队头还是队尾Q.baseQ.rear=x;Q.rear=(Q.rear+1)%MAXSIZE; /插入在队尾elseQ.front=(Q.front-1)%MAXSIZE;Q.baseQ.front=x; /插入在队头return OK;/EnDQueue Status DeDQueue(DQueue &Q,int &x)/输出受限的双端队列的出队操作if(Q.front=Q.rear) return INFEASIBLE; /队列空x=Q
14、.baseQ.front;Q.front=(Q.front+1)%MAXSIZE;return OK;/DeDQueue 3.34 void Train_Rearrange(char *train)/这里用字符串train表示火车,P表示硬座,H表示硬卧,S表示软卧,最终按PSH的顺序排列r=train;InitDQueue(Q);while(*r)if(*r=P)printf(E);printf(D); /实际上等于不入队列,直接输出P车厢else if(*r=S)printf(E);EnDQueue(Q,*r,0); /0表示把S车厢从头端入队列elseprintf(A);EnDQueue(Q,*r,1); /1表示把H车厢从尾端入队列/whilewhile(!DQueueEmpty(Q)printf(D);DeDQueue(Q);/while /从头端出队列的车厢必然是先S后H的顺序 /Train_Rearrange
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1