栈的基本操作及如何判断一个表达式中的左右括号是否匹配

 转载于:https://blog.csdn.net/qq_34992845/article/details/70313454       如有侵权,请联系本人删除。

我们都知道,栈(stack)具有后进先出的特点,所以在我们思考一个表达式中的左右括号是否匹配问题时,就自然会想到是不是可以利用栈的特点来判断左右括号是否匹配呢?

主要思路如下:

1.扫描整个表达式; 
2.判断当前字符是否为括号(左右括号) 
①如果不是,则继续扫描下一个字符; 
②如果是,则判断当前操作符是否为左括号 
若为左括号—>直接入栈。 
如果不是左括号,则说明是右括号,这时应该判断栈是否为空。 
若栈为空—> 说明此表达式右括号多于左括号。 
若栈不为空—>判断当前操作符是否和栈顶操作符匹配,若不匹配—->说明左右括号不匹配,若匹配—–>则继续判断下一个操作符。 
3.最后,判断栈是否为空 
①栈不为空—–>说明左括号多于右括号 
②栈为空—–>说明括号匹配成功。

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<stack>
#include<cassert>

bool IsOperator(char ch)
{
    if (ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == '{' || ch == '}')
    {
        return true;
    }
    return false;
}


bool MatchBrackets(char* str)
{
    stack<char> s;
    assert(str);
    //首先扫描字符串,然后判断是否为括号
    while (*str != '\0')
    {
        if (!IsOperator(*str))
        {
            str++;
            continue;
        }
        if (*str == '(' || *str == '[' || *str == '{')
        {
            s.push(*str);
            str++;
        }
        else//右括号
        {
            if (s.empty())
            {
                cout << "右括号多于左括号" << endl;
                return false;
            }
            if (*str == ')' && s.top() == '(' || *str == ']' && s.top() == '[' || *str == '}' && s.top() == '{')
            {
                s.pop();
                str++;
            }
            else
            {
                cout << "左右括号不匹配" << endl;
                return false;
            }
        }
    }
    if (!s.empty())
    {
        cout << "左括号多于右括号" << endl;
        return false;
    }
    cout << "左右括号匹配正确" << endl;
    return true;
}

void Test()
{
    char a[] = "(())abc{[(])}"; // 左右括号次序匹配不正确
    char b[] = "(()))abc{[]}"; // 右括号多于左括号
    char c[] = "(()()abc{[]}"; // 左括号多于右括号
    char d[] = "(())abc{[]()}"; // 左右括号匹配正确
    cout << MatchBrackets(a) << endl;
    cout << MatchBrackets(b) << endl;
    cout << MatchBrackets(c) << endl;
    cout << MatchBrackets(d) << endl;
}

int main()
{
    Test();
    return 0;
}
  •  

结果如下: 
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_40763929/article/details/81540546
今日推荐