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


     转载于: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 != '')
        {
            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;
    }
    •  

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

  • 相关阅读:
    rails enum用于存储数据
    single-table inheritance 单表继承
    imageable.touch
    jbuilder的set!方法重构接口
    Two Strings Are Anagrams
    java项目导入IntelliJ IDEA
    mac 下载安装 IntelliJ IDEA Tomcat
    Merge k Sorted Lists Leetcode Java
    ruby on rails validates uniqueness
    使用update!导致的更新时候的错误信息不显示 ruby on rails
  • 原文地址:https://www.cnblogs.com/Romantic-Chopin/p/12451486.html
Copyright © 2020-2023  润新知