简单栈的应用之括号匹配

来源:互联网 发布:达芬奇软件作者 编辑:程序博客网 时间:2024/06/05 05:10

常常我们在写程序时,编译代码能发现我们括号匹配正确与否,今天我们模拟实现一个简单的括号匹配函数,用以复习栈的引用

#include<iostream>#include<stack>using namespace std;bool is_Brackets(char ch){    if (ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == '{' || ch == '}')        return true;    else return false;}bool is_left_Brackets(char ch){    if (ch == '(' || ch == '[' || ch == '{')        return true;    else return false;}int main(void){    char str[20];    char ch;    int i = 0;    scanf("%s",&str);    //cin >> str;    stack<char> sta;    while (str[i])    {        if (!is_Brackets(str[i]))        {            ;        }        else        {            if (is_left_Brackets(str[i]))            {                sta.push(str[i]);            }            else            {                if (sta.empty())                {                    printf("左括号缺少!!!");                    return 0;                }                ch=sta.top();                switch (str[i])                {                case ')':                    if (ch == '(')                    {                        sta.pop();                        break;                    }                       else                    {                        printf("括号不匹配!!!");                        return 0;                    }                case ']':                    if (ch == '[')                    {                        sta.pop();                        break;                    }                    else                    {                        printf("括号不匹配!!!");                        return 0;                    }                case '}':                    if (ch == '{')                    {                        sta.pop();                        break;                    }                    else                    {                        printf("括号不匹配!!!");                        return 0;                    }                }            }        }        i++;    }    if (sta.empty())        printf("括号匹配!!!");    else printf("右括号缺少!!!");    return 0;}

上面实现的有点水,下面实现一个优化过的版本(有百度过)

#include <iostream>  //#include <cmath>  #include <stack>  using namespace std;bool judge(const char *);char getType(const char);bool match(const char, const char);int main(){    cout << "输入待测序列:" << endl;    char seq[20];    cin >> seq;           //读取一个序列      cout << (judge(seq) ? "成功" : "失败") << endl;    //判断并输出结果      return 0;}//判断字符类型 左括号,右括号 或 其他  char getType(const char c){    char bracketSet[] = "([{}])";    int i;    for (i = 0; i < 6; i++)    {        if (bracketSet[i] == c) break;    }    if (i<3) return 'l';    else if (i < 6) return 'r';    else return 'n';}//判断是否为一对匹配的括号  bool match(const char cL, const char cR){    if (cL == '(')        return cR == ')' ? true : false;    else        return cR == cL + 2 ? true : false;}//判断序列是否括号匹配  bool judge(const char * str){    stack<char> S;      //新建一个栈      int i;    char bracketType;    for (i = 0; str[i] != '\0'; i++)    {        bracketType = getType(str[i]);      //判断是否为括号          if (bracketType == 'l')        {            S.push(str[i]);     //遇到左括号,入栈          }        else if (bracketType == 'r')        {            //遇到左括号,与栈顶比较,若匹配,栈释放顶层元素              if (match(S.top(), str[i])) S.pop();            //否则匹配失败,结束函数              else return false;        }    }    //判断栈内是否还有左括号,若无,则匹配成功      if (S.empty()) return true;    else return false;}
原创粉丝点击