括号匹配算法

来源:互联网 发布:程序员 白发老头图片 编辑:程序博客网 时间:2024/06/06 18:51

题目:有一段字符串,包含"("和")"、"["和"]"、"{"和"}"中的一种或者多种,这三种括号出现次序不定,可随意嵌套。编写代码判断三种括号是否正确匹配。


思路一(栈的思想)括号匹配是运用栈的经典思想。算法中设置一个空栈,每次读入一个括号,若是左括号,则压入栈中,等到对应的右括号压栈,若是右括号,能使置于栈顶的最急迫的期待得以消解,此时将栈顶的左括号弹出,或者是不匹配的情况,判断为不匹配。待算法结束时,栈中应该为空,判断为匹配。


前提说明:

顺序表类型定义如下:

typedef struct 

{
    ElemType *elem;
    int       length;
    int       listsize;
} SqList;  // 顺序表

Stack是一个已实现的栈。

可使用的相关类型和函数:
typedef char SElemType; // 栈Stack的元素类型
Status InitStack(Stack &s);
Status Push(Stack &s, SElemType e);
Status Pop(Stack &s, SElemType &e);
Status StackEmpty(Stack s);
Status GetTop(Stack s, SElemType &e);

主要函数代码:

 1 Status MatchCheck(SqList exp) 2 /* 顺序表exp表示表达式;                        */ 3 /* 若exp中的括号配对,则返回TRUE,否则返回FALSE */ 4 { 5     Stack s; 6     char e; 7  8     //逐个读入括号 9     for(int i=0;i<exp.length;i++)10     {11         if(exp.elem[i]=='('||exp.elem[i]=='{'||exp.elem[i]=='[')//若遇左括号,则直接入栈12         {            13             Push(s,exp.elem[i]);14         }15         else if(exp.elem[i]==')')//若遇右圆括号,则尝试匹配栈顶括号16         {            17             if(GetTop(s,e))18             {19                 if(e=='(')//匹配成功,左圆括号出栈20                 {21                     Pop(s,e);22                 }      23                 else//匹配不成功24                 {25                     return FALSE;26                 }          27             }  28             else//栈为空,匹配不成功29             {30                 return FALSE;               31             } 32         }33         else if(exp.elem[i]=='}')//若遇右花括号,则尝试匹配栈顶括号34         {35             if(GetTop(s,e))36             {37                 if(e=='{')//匹配成功,左花括号出栈38                 {39                     Pop(s,e);40                 }      41                 else//匹配不成功42                 {43                     return FALSE;44                 }          45             }46             else47             {48                 return FALSE;49             } 50         }51         else if(exp.elem[i]==']')//若遇右方括号,则尝试匹配栈顶括号52         {53             if(GetTop(s,e))54             {55                 if(e=='[')//匹配成功,左方括号出栈56                 {57                     Pop(s,e);58                 }      59                 else//匹配不成功60                 {61                     return FALSE;62                 }          63             }64             else65             {66                 return FALSE;67             } 68         }69     }    70     if(StackEmpty(s))//当所有括号匹配成功时,栈应为空71     {72         return TRUE;73     }74     else75     {76         return FALSE;77     }78 }


以上本人参考他人代码,深刻学习理解栈的思想与运用,如有错误请指出。


思路二(逻辑思想)从整体字符串来看,符合括号匹配只要满足两个条件:(1)相同符号的左括号数与右括号的个数必须相同;(2)在字符串的任意位置,相同符号的右括号个数必须小于等于左括号个数。两个条件同时满足时,必定匹配。


代码:


输出结果:


本人能力有限,该方法为本人编写,若有不足的地方,请指出。

1 0