北邮算法与数据结构习题参考答案

作业参考答案
一、(带头结点)多项式乘法 C = A×B:
void  PolyAdd ( list  &C,  list  R)    // R 为单个结点
{
  p=C;
  while  ((p->next) && (p->next->exp>R->exp))  p=p->next;
  if  ((p->next) || (p->next->exp<R->exp))
{  R->next=p->next;  p->next=R;  }  else
{  p->next->inf += R->inf;  delete  R;
  if  ( !  p->next->inf )
    {  R=p->next;  p->next=R->next;  delete  R; }
}
}
void  PolyMul ( list  A,  list  B,  list  &C )
{
  C=new  struct  node;  C->next=NULL;  q=B->next;
  While  ( q )
  {
p=A->next;
while  ( p )
{
  r = new  struct  node;  r->exp = p->exp + q->exp;
  r->inf = p-> inf * q->inf;  PolyAdd(C, r);
  p=p->next;
}
q=q->next;
  }
}
二、梵塔的移动次数:
已知移动次数迭代公式为: M ( n ) = 2M ( n-1 ) + 1
初值为:                M ( 0 ) = 0
则:                    M ( n ) = 2 ( 2M ( n-2 ) + 1 ) + 1
                              = 4M ( n-2 ) + 3
                              = 8M ( n-3 ) + 7
                              = 2iM ( n-i ) + 2i 1
若n=i , 则M ( n-n ) = 0, 故:M ( n ) = 2nM ( n-n ) + 2n 1
                              = 2n 1
所以,梵塔的移动次数为2n 1次。
三、简化的背包问题:
void  Pack ( int  m,  int  i,  int  t )  // 初始值为: 1 1 t
{
  for  ( k=i;  k<=n;  k++ )
  {
solution[m] = weight[k];
if  ( t == weight[k] )
{
  for  ( j=1;  j<=m;  j++ )  cout<<solution[j];  cout<<endl;
}  else  if  ( t > weight[k] )  Pack ( m+1, k+1, t - weight[k] );
  }
}
四、判断括号是否配对:
int  Correct ( string  s )
数据结构与算法第二版课后题答案
{
  Inistack(Q);
  for  ( i=0;  s[i] == ‘=’;  i++ )  // 表达式以‘=’结束
  {
switch  ( s[i] )
{
case  ‘(’:
case  ‘[’:
case  ‘{’:
  Push ( Q, s[ i ] );  break;
case  ‘)’:
case  ‘]’:
case  ‘}’:
        if  ( Empty(Q))  return  0;  t=Pop(Q);
        if  ( !  Matching( t, s[i] ))  return  0;
}
  }
  if  ( !  Empty(Q) )  return  0;
return  1;
}
五、堆栈可能的输出:
12341243  1324  1342  1423  1432
21342143  2314  2341  2413  2431
3124  3142  3214  3241  3412 3421
41234134213  4234312  4321
六、用两个堆栈实现一个队列:
int  FullQ ( )
{
  if  (Full (S1) && ! Empty (S2))  return  1;  return  0;
}
int  EmptyQ ( )
{
  if  ( Empty (S1) && Empty (S2))  return  1;  return  0;
}
void  Enqueue ( elemtype  x)
{
  if (Full(S1)) if (Empty(S2)) while (! Empty (S1)) Push(S2, Pop(S1));
  if  (! Full(S1))  Push(S1, x);
}
elemtype  Dequeue ( )
{
  if (Empty(S2)) while (! Empty(S1)) Push(S2, Pop(S1));
  if  (! Empty(S2))  return  Pop(S2);
}
七、生成新串及字符第一次出现位置:
int  Index ( string  S,  string  T )
{
  for  ( i=1;  i + Len(T)-1<=Len(S);  i++ )
    if  Equal ( Sub ( S, I, Len (T)), T )  return  i;
  return  0;
}
void  CreatNewStr ( string  S,  string  T,  string  R,  arrant  P)
{
  R=“”;  j=0;
  for  ( i=1;  i<=Len(S);  i++ )

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。