栈在括号匹配中的应用

目录

原理  

算法描述 

 算法流程图

具体代码

运行结果图  

正确测试样例

错误测试样例

原理  

    遇到左括号进行入栈操作,遇到右括号则进行出栈操作,对符号进行匹配判断其合法性

 合法情况:扫描到右括号时都有与之匹配对应的左括号出栈

 不可法情况:1.左右括号不匹配——扫描到右括号时,其对应的左括号不匹配

                       2. 右括号单身——扫描到右括号且栈空

                       3.左括号单身——处理完所有的括号后,栈不空(即有剩余的左括号)

算法描述 

bool bracketCheck (char str[], int length) {

        SqStack S;

        InitStack(S); //初始化栈

        for (int i; i<length; i++) {

               if (str[i] == '(' || str[i] == '[' || str[i] == '{' )

                     Push(S,str[i]);  //扫描到左括号,入栈

               else {

                     if (StackEmpty(S)) //右括号单身

                          return false;

                     char topElem;

                     Pop(S, topElem); //栈顶出栈

                     //左右括号不匹配

                     if (str[i] == ')' && topElem != '(')

                         return false;

                     if (str[i] == ']' && topElem != '[')

                         return false;

                     if (str[i] == '}' && topElem != '{')

                         return false;

                }

         }

         return StackEmpty(S);  //扫描完全部括号以后,判空,看是否有左括号单身情况

}

 算法流程图

具体代码

#define Maxsize 20

typedef struct
{
    int data[Maxsize];
    int top;
    int length;
}SqStack;

//初始化
void InitStack(SqStack &S)
{
    S.top = -1;
    S.length = 0;
}

//判空
bool EmptyStack(SqStack S)
{
    if (S.length == 0)
        return true;
    else
        return false;
}

//入栈
void Push(SqStack &S, char c)
{
    if (S.length == Maxsize)
    {
        cout <<"栈满"<<endl;
        return;
    }
    S.top++;
    S.data[S.top] = c;
    S.length++;
}

//出栈
void Pop(SqStack &S, char &c)
{
    if (S.length == 0)
    {
        cout << "栈空" <<endl;
        return;
    }
    c = S.data[S.top];
    S.top--;
    S.length--;
}

//符号匹配函数
bool bracketCheck(char str[], int length)
{
    SqStack S;
    InitStack(S);
    for (int i; i<length; i++)
    {
        if (str[i]=='(' || str[i]=='[' || str[i]=='{')
        {
            Push(S,str[i]); //左括号入栈
        }
        else  //扫描到右括号
        {
            if (EmptyStack(S))
            {
                cout <<"匹配错误,存在右括号单身情况"<<endl;
                cout << "错误地方:第"<< i+1 <<"个元素"<<str[i]<<endl;
                return false;
            }
            char topelem; //定义栈顶元素,用于后续比较匹配问题
            Pop(S,topelem);
            if (str[i]==')' && topelem!='(')
            {
                cout <<"匹配错误,存在左右括号不匹配情况"<<endl;
                cout << "错误地方:第"<< i+1 <<"个元素"<<str[i]<<endl;
                return false;
            }
            if (str[i]==']' && topelem!='[')
            {
                cout <<"匹配错误,存在左右括号不匹配情况"<<endl;
                cout << "错误地方:第"<< i+1 <<"个元素"<<str[i]<<endl;
                return false;
            }
            if (str[i]=='}' && topelem!='{')
            {
                cout <<"匹配错误,存在左右括号不匹配情况"<<endl;
                cout << "错误地方:第"<< i+1 <<"个元素"<<str[i]<<endl;
                return false;
            }
        }
    }
    //遍历完全部括号后
    if(!EmptyStack(S))
    {
        cout <<"匹配错误,存在左括号单身情况"<<endl;
        return false;
    }
    else
        return true;
}

int main()
{
    cout <<"请输入有'('')''['']''{''}'组成的串:";
    char str[Maxsize];
    cin >> str;
    int len = strlen(str);
    if(bracketCheck(str,len))
    {
        cout<<"匹配成功"<<endl;
    }

    return 0;
}

运行结果图  

正确测试样例:

错误测试样例:

1.左括号单身

2.右括号单身 

3.左右括号不匹配

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值