栈的运用(3)

问题描述:

 试写一个判别表达式中开,闭括号是否配对出现的算法

问题分析:

这道题很简单,表达式存入数组中,判断,开,闭括号的个数相等,但是也要注意顺序,你不能出现这样的情况(【)】这个就不是正确的表达式了,也就是说两个匹配的操作符之间不能有其他的操作符。想到昨天做的简答题,把运算符入栈再去判断。

Int main()

{

  Stack s;

  initStack s;

 Char buffer[30];

  Int i;

  Char x,y;

  Scanf(%s,buffer);

  While(buffer[i])

  {

    If(buffer[i]==(||buffer[i]==[||buffer[i]==)||buffer[i]==])

     Push(s,buffer[i]);

     I++;

 }

 While(!stackempty(s))//怎样使栈后移,还是遇到坎了。所以这里的思路出现问题。。

(是还没有很理解,出栈的算法和判断栈为空的算法把,理解了,就明白,怎样用了,现在了解了点)

{

   Pop(s,x);

if(x=()

 {

  Pop(s,y);

  If(y==))

  Printf(“”)

}

 

书上的算法:

BOOL BracketCorrespondency(char  a[])

{

  Int i=0;

  Stack s;

  InitStack(s);

  ElemType x;

  While(a[i]){

        Switch(a[i]){

        Case (:

         Push(s, a[i]);

         Break;

        Case [:

         Push(s, a[i]);

         Break;

        Case )

          GetTop(s, x);

          If(x==()  

            Pop(s,x);

          Else return false;

          Break;

        Case ]:

           GetTop(s,x);

            If(x==[)

            Pop(s,x);

            Else return false;

            Break;

        Default:

            Break;

       }

    I++;

}

If(s.size!=0)

   Return false;

Return true;

}

这个算法很好地解决了这个运算符匹配的问题。

原文地址:https://www.cnblogs.com/wj204/p/3044349.html