栈的运用(2)

问题描述:

 写一个算法,识别依次读入的一个以@为结束符的字符序列是否为形如‘序列1&序列2’模式的字符序列。其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是

问题分析:

 思路应该是有的,先读入字符序列,当读到‘&’时,前面的一个入队列,后面的一个进栈,然后都用数组来保存,最后比较两数组的元素是否都相同,若相同,则是该模式。

Int main()

{

  Stack s;

  Queue q;

  Char buffer1[20]; 

  Char buffer2[20];

  Int i=0,count=0,j=0;

  Char temp=’’;

  Printf(请输入字符序列);

  While(temp!=@){

    Scanf(%c, &temp);

Buffer1[i]=temp;

I++;

}

While(buffer1[i]!=&){

Push(q,buffer1[i]);

I--;

}

If (buffer[i]==&)

{

   Count++;

   I--;

   If(count==1)

   { 

     While(buffer1[i])

     {

      Push(s,buffer1[i]);

      I--;

     }

   }

   Else 

    {

       printf(这不是模式的字符序列);

       Return ;

    }

}

I=0;

j=0;

While(!stackempty(s)){

Pop(s,buffer1[i]);

I++;

}

While(!queueempty(q))

{

 Pop(q,buffer2[j]);

 J++;

}

If(i==j)

{

  While(buffer[i])

 {

      If(Strcmp(buffer[i],buffer[j])) 

      {

       I++;

       j++;

      }

      Else

      {

        Printf(这不是模式的字符序列);

        Return;

      }

      }//while

    }//if

    Else

{

   Printf(这不是模式字符序列);

   Return;

}

 }

看得出我把问题弄复杂了,把复杂简单化,要理清思路。书上的算法:

Bool Symmetry(char  a[])

{

     Int i=0;

     Stack s;

     InitStack(s);

     ElemType x;

     While(a[i]!=&&&a[i])

     {

        Push(s, a[i]);

        I++;

     }

If(a[i]) return false;

I++;//跳过&这个字符

While(a[i])

{

  Pop(s,x);//先弹出来,然后立即判断

   If(x!=a[i]){

   DestoryStack(s);

   Return false;//表明已经不是模式字符串

   }

   I++;

}

Return true;

}

 

posted @ 2013-04-26 10:50  wj704  阅读(249)  评论(0编辑  收藏  举报