2 myiloveuuu myiloveuuu 于 2015.06.20 10:05 提问

c语言栈的平衡符号的问题 1C

本人新手+小白一枚
这段程序看了n个小时修改改了很多次还是木有得到真谛,关键就在于check函数判断封闭符号是否和开放鼓号相匹配,一直也没有调试好,请教大神给我指点一下
int
CheckSymbol(Stack S,char str[])
{
int i,j;
for(i=0;i<10;i++)
{
if(str[i]=='{'||str[i]=='('||str[i]=='[')
{
Push(str[i],S);//如果是开放符号则压入栈

      for(j=i;j<10;j++)

      {
          if(str[j]=='}'&&S->Array[S->TopOfStack]=='{'||str[j]==')'&&S->Array[S->TopOfStack]=='('||str[j]==']'&&S->Array[S->TopOfStack]=='[')
      {
          return 0;
          Pop(S);//如果匹配则返回0并且弹出
      }
      else 
         return 1;
      }
  }
  else 
      return 1;
}       

  }

main()
{
char str[10]="1[23";
Stack S;

if(CheckSymbol(S,str)==0)
printf("match");
if(CheckSymbol(S,str)==1)
printf("no match");
}

4个回答

bullzerone
bullzerone   2015.06.20 13:41

这个是栈常见应用之一。
如果遇到括号左边,就入栈,如果是右边,就出栈,最后如果栈为空,说明匹配成功,否则不成功。
下面是我自己写的一个简单测试代码,实现一个括号匹配函数。其中栈我是用字符数组实现的一个简单序列栈。没给出栈代码,你看你自己栈的实现。

void Match(char* a,int size)
{

int i;
for(i=0;i<size;i++)
{
    if(a[i]=='('||a[i]=='['||a[i]=='{')//如果是括号左边
    {
        pushstack(a[i]);//入栈
    }
    else if(a[i]==')'||a[i]==']'||a[i]=='}')//如果是括号右边
    {
        popstack();//出栈
    }
}
if(emptystack())//如果栈为空
printf("success\n");//匹配成功
else//如果不为空
printf("not match\n");//匹配不成功

}

myiloveuuu
myiloveuuu   2015.06.21 10:48

谢谢你这么热心为我解答,我有一个问题,你怎么能知道符号是匹配的呢

myiloveuuu
myiloveuuu   2015.06.21 10:48

谢谢你这么热心为我解答,我有一个问题,你怎么能知道符号是匹配的呢

bullzerone
bullzerone   2015.06.21 11:28

一会儿我给你发个图片,演示一下,这个图片是拍的,比我实现的复杂。你看一下,它还会匹配 /*和*/。过程是开始栈为空,开始如果遇到左边就入栈,遇到右边
就出栈,出栈的是和最近遇到的右括号 匹配的左括号。如果最后栈空了,说明是匹配的,否则就不匹配。

图片说明

Csdn user default icon
上传中...
上传图片
插入图片