知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第三章参考答案

Posted

篇首语:心境是可以把地狱变成天堂,也可以把天堂变成地狱。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第三章参考答案相关的知识,希望对你有一定的参考价值。

  第三章 栈与队列

  

  typedef struct

  Elemtype *base[ ];

  Elemtype *top[ ];

  BDStacktype; //双向栈类型

  Status Init_Stack(BDStacktype &s int m)//初始化一个大小为m的双向栈s

  

  s base[ ]=(Elemtype*)malloc(sizeof(Elemtype));

  s base[ ]=s base[ ]+m;

  s top[ ]=s base[ ];

  s top[ ]=s base[ ];

  return OK;

  //Init_Stack

  Status push(BDStacktype &s int i Elemtype x)//x入栈 i= 表示低端栈 i= 表示高端栈

  

  if(s top[ ]>s top[ ]) return OVERFLOW; //注意此时的栈满条件

  if(i== ) *s top[ ]++=x;

  else if(i== ) *s top[ ] =x;

  else return ERROR;

  return OK;

  //push

  Status pop(BDStacktype &s int i Elemtype &x)//x出栈 i= 表示低端栈 i= 表示高端栈

  

  if(i== )

  

  if(s top[ ]==s base[ ]) return OVERFLOW;

  x=* s top[ ];

  

  else if(i== )

  

  if(s top[ ]==s base[ ]) return OVERFLOW;

  x=*++s top[ ];

  

  else return ERROR;

  return OK;

  //pop

  

  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; //把 H 接在后部

  

  //Train_arrange

  

  int IsReverse()//判断输入的字符串中 & 前和 & 后部分是否为逆串 是则返回 否则返回

  

  InitStack(s);

  while((e=getchar())!= & )

  push(s e);

  while((e=getchar())!= @ )

  

  if(StackEmpty(s)) return ;

  pop(s c);

  if(e!=c) return ;

  

  if(!StackEmpty(s)) return ;

  return ;

  //IsReverse

  

  Status Bracket_Test(char *str)//判别表达式中小括号是否匹配

  

  count= ;

  for(p=str;*p;p++)

  

  if(*p== ( ) count++;

  else if(*p== ) ) count ;

  if (count< ) return ERROR;

  

  if(count) return ERROR; //注意括号不匹配的两种情况

  return OK;

  //Bracket_Test

  

  Status AllBrackets_Test(char *str)//判别表达式中三种括号是否匹配

  

  InitStack(s);

  for(p=str;*p;p++)

  

  if(*p== ( ||*p== [ ||*p== ) push(s *p);

  else if(*p== ) ||*p== ] ||*p== )

  

  if(StackEmpty(s)) return ERROR;

  pop(s c);

  if(*p== ) &&c!= ( ) return ERROR;

  if(*p== ] &&c!= [ ) return ERROR;

  if(*p== &&c!= ) return ERROR; //必须与当前栈顶括号匹配

  

  //for

  if(!StackEmpty(s)) return ERROR;

  return OK;

  //AllBrackets_Test

  

  typedef struct

   int x;

  int y;

   coordinate;

  void Repaint_Color(int g[m][n] int i int j int color)//把点(i j)相邻区域的颜色置换为color

  

  old=g[i][j];

  InitQueue(Q);

  EnQueue(Q I j);

  while(!QueueEmpty(Q))

  

  DeQueue(Q a);

  x=a x;y=a y;

  if(x> )

  if(g[x ][y]==old)

  

  g[x ][y]=color;

  EnQueue(Q x y); //修改左邻点的颜色

  

  if(y> )

  if(g[x][y ]==old)

  

  g[x][y ]=color;

  EnQueue(Q x y ); //修改上邻点的颜色

  

  if(x

  if(g[x+1][y]==old)

  

  g[x+1][y]=color;

  EnQueue(Q,x+1,y); //修改右邻点的颜色

  

  if(y

  if(g[x][y+1]==old)

  

  g[x][y+1]=color;

  EnQueue(Q,x,y+1); //修改下邻点的颜色

  

  //while

  //Repaint_Color

  分析:本算法采用了类似于图的广度优先遍历的思想,用两个队列保存相邻同色点的横坐标和纵坐标.递归形式的算法该怎么写呢?

  3.21

  void NiBoLan(char *str,char *new)//把中缀表达式str转换成逆波兰式new

  

  p=str;q=new; //为方便起见,设str的两端都加上了优先级最低的特殊符号

  InitStack(s); //s为运算符栈

  while(*p)

  

  if(*p是字母)) *q++=*p; //直接输出

  else

  

  c=gettop(s);

  if(*p优先级比c高) push(s,*p);

  else

  

  while(gettop(s)优先级不比*p低)

  

  pop(s,c);*(q++)=c;

  //while

  push(s,*p); //运算符在栈内遵循越往栈顶优先级越高的原则

  //else

  //else

  p++;

  //while

  //NiBoLan //参见编译原理教材

  3.22

  int GetValue_NiBoLan(char *str)//对逆波兰式求值

  

  p=str;InitStack(s); //s为操作数栈

  while(*p)

  

  if(*p是数) push(s,*p);

  else

  

  pop(s,a);pop(s,b);

  r=pute(b,*p,a); //假设pute为执行双目运算的过程

  push(s,r);

  //else

  p++;

  //while

  pop(s,r);return r;

  //GetValue_NiBoLan

  3.23

  Status NiBoLan_to_BoLan(char *str,stringtype &new)//把逆波兰表达式str转换为波兰式new

  

  p=str;Initstack(s); //s的元素为stringtype类型

  while(*p)

  

  if(*p为字母) push(s,*p);

  else

  

  if(StackEmpty(s)) return ERROR;

  pop(s,a);

  if(StackEmpty(s)) return ERROR;

  pop(s,b);

  c=link(link(*p,b),a);

  push(s,c);

  //else

  p++;

  //while

  pop(s,new);

  if(!StackEmpty(s)) return ERROR;

  return OK;

  //NiBoLan_to_BoLan

  分析:基本思想见书后注释.本题中暂不考虑串的具体操作的实现,而将其看作一种抽象数据类型stringtype,对其可以进行连接操作:c=link(a,b).

  3.24

  Status g(int m,int n,int &s)//求递归函数g的值s

  

  if(m==0&&n>=0) s=0;

  else if(m>0&&n>=0) s=n+g(m-1,2*n);

  else return ERROR;

  return OK;

  //g

  3.25

  Status F_recursive(int n,int &s)//递归算法

  

  if(n<0) return ERROR;

  if(n==0) s=n+1;

  else

  

  F_recurve(n/2,r);

  s=n*r;

  

  return OK;

  //F_recursive

  Status F_nonrecursive(int n,int s)//非递归算法

  

  if(n<0) return ERROR;

  if(n==0) s=n+1;

  else

  

  InitStack(s); //s的元素类型为struct int a;int b;

  while(n!=0)

  

  a=n;b=n/2;

  push(s,a,b);

  n=b;

  //while

  s=1;

  while(!StackEmpty(s))

  

  pop(s,t);

  s*=t.a;

  //while

  

  return OK;

  //F_nonrecursive

  3.26

  float Sqrt_recursive(float A,float p,float e)//求平方根的递归算法

  

  if(abs(p^2-A)<=e) return p;

  else return sqrt_recurve(A,(p+A/p)/2,e);

  //Sqrt_recurve

相关参考

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第八章答案

  第八章动态存储管理    typedefstruct  char*start;  intsize;  fmblock;//空闲块类型  char*Malloc_Fdlf(intn)//遵循最后分配

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第九章答案

  第九章查找    intSearch_Sq(SSTableSTintkey)//在有序表上顺序查找的算法监视哨设在高下标端    STelem[STlength+]key=key;  for(i=

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第六章答案

  第六章树和二叉树    intIs_Descendant_C(intuintv)//在孩子存储结构上判断u是否v的子孙是则返回否则返回    if(u==v)return;  else    if

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第五章答案

  第五章数组和广义表    voidRSh(intA[n]intk)//把数组A的元素循环右移k位只用一个辅助存储空间    for(i=;i<=k;i++)  if(n%i==&&a

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第四章答案

  第四章串    voidString_Reverse(StringtypesStringtype&r)//求s的逆串r    StrAssign(r);//初始化r为空串  for(i=S

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第七章答案

  第七章图    StatusBuild_AdjList(ALGraph&G)//输入有向图的顶点数边数顶点信息和边的信息建立邻接表    InitALGraph(G);  scanf(%d

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第二章参考答案

  第二章线性表    StatusDeleteK(SqList&aintiintk)//删除线性表a中第i个元素起的k个元素    if(i<||k<||i+k>aleng

知识大全 数据结构备考[4]

  四参考资料  目前国内数据结构教材的版本有PascalCC++Java多但C语言版本的教材是使用最广的教材虽然考试大纲还没有出来但基本上可以确定的教材是清华大学出版社出版严蔚敏等著的《数据结构(C

知识大全 数据结构与算法线性表复习习题6[3]

      假设在算法描述语言中引入指针的二元运算异或若a和b为指针则a⊕b的运算结果仍为原指针类型且  a⊕(a⊕b)=(a⊕a)⊕b=b