典型的括号匹配问题c++

简介: 典型的括号匹配问题c++

问题描述


C++栈问题,括号匹配问题求解,无法AC,求指教!

【题目描述】

设有一字符串中有三种括号:(),[],{};忽略不看其他字符,判断这些括号的匹配情况是否成立。例如:“(([()])){}”是匹配的,而“([)]”则是不匹配的。

【输入格式】

只有一行且只有一个数据:一串以“@”为结束符的字符串。字符串长度不会超过20000

【输出格式】

只有一行且只有一个数据:如果是匹配的,则输出:“OK!”,否则输出第一个不相匹配的括号位置(输入数据保证相同类型的左右括号个数相等)。

【输入样例 】

82u(idkj[kdk]js{ksf(k[sk)k])o}i@

【输出样例】

25


代码分析


首先读入以@结尾的字符串:

string s;
getline(cin, s, '@');

接着定义一个pair类型的栈,用来存储左括号及其位置:

stack<pair<char, int>> st

然后遍历字符串中的每个字符,在遍历过程中,如果是左括号,则将其加入栈中,如果是右括号,则弹出栈顶元素进行比较,如果不匹配则输出位置,匹配则弹出栈顶元素:

for (int i = 0; i < s.size(); i++) {
    if (s[i] == '(' || s[i] == '[' || s[i] == '{') { // 左括号入栈
        stk.push({s[i],i}); // 这里记录了左括号位置
    } else if (s[i] == ')' || s[i] == ']' || s[i] == '}') { // 右括号出栈比较
        if (stk.empty() || !isMatch(stk.top().first, s[i])) { // 不匹配
            cout << i << endl;
            return 0;
        } else { // 匹配,弹出左括号
            stk.pop();
        }
    }
}

isMatch函数判断两个括号是否匹配,这里使用了逻辑运算符的短路性质来判断:

bool isMatch(char left, char right) {
    return (left == '(' && right == ')') || (left == '[' && right == ']') || (left == '{' && right == '}');
}

最后,如果遍历完字符串之后,栈中还有元素,则说明不匹配,输出栈顶元素的位置,否则输出"OK!"表示匹配:

if (!stk.empty()) {
    cout << stk.top().second << endl;
} else {
    cout << "OK!" << endl;
}

代码比较简洁明了,这样就能够实现括号匹配的功能。


完整代码


#include <iostream>
#include <stack>
using namespace std;
bool isMatch(char left, char right) {
    return (left == '(' && right == ')') || (left == '[' && right == ']') || (left == '{' && right == '}');
}
int main() {
    string s;
    getline(cin, s, '@'); // 读入以@结尾的字符串
    stack<pair<char, int>> stk; // 使用pair记录括号类型和位置
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '(' || s[i] == '[' || s[i] == '{') { // 左括号入栈
            stk.push({s[i],i});
        } else if (s[i] == ')' || s[i] == ']' || s[i] == '}') { // 右括号出栈比较
            if (stk.empty() || !isMatch(stk.top().first, s[i])) { // 不匹配
                cout << i << endl;
                return 0;
            } else { // 匹配,弹出左括号
                stk.pop();
            }
        }
    }
    // 遍历完字符串后,栈中还有元素说明不匹配
    if (!stk.empty()) {
        cout << stk.top().second << endl;
    } else {
        cout << "OK!" << endl;
    }
    return 0;
}
相关文章
|
6月前
|
Java C++
愤怒的牛(java c++)(二分典型例子)
愤怒的牛(java c++)(二分典型例子)
68 1
|
算法 C++
详细实例说明+典型案例实现 对枚举法进行全面分析 | C++
简单的来说,算法就是用计算机程序代码来实现数学思想的一种方法。学习算法就是为了了解它们在计算机中如何演算,以及在当今的信息时代,它们是如何在各个层面上影响我们的日常生活的,从而提高我们的逻辑思维能力和处理实际问题的能力。善用算法、巧用算法,是培养程序设计逻辑的重中之重,许多实际的问题都可用多个可行的算法来解决, 但是要从中找出最优的解决算法却是一项挑战。
215 0
详细实例说明+典型案例实现 对枚举法进行全面分析 | C++
|
算法 C++
详细实例说明+典型案例实现 对迭代法进行全面分析 | C++
上面我们对迭代算法进行了细致的举例和经典代码的讲解。使用该算法时,要注意体会我们所要求的东西它在程序代码中的更新迭代过程,理解核心思想从而去更好的运用这种常用的经典算法解决常规问题。
464 0
详细实例说明+典型案例实现 对迭代法进行全面分析 | C++
|
存储 算法 C++
详细实例说明+典型案例实现 对动态规划法进行全面分析 | C++
在上面我们通过通俗易懂的例子对动态规划法进行了理解,也用该方法的核心对斐波那契数列进行了优化。动态规划是分治法的一个延伸,它增加了记忆机制的使用,将处理过的子问题的答案记录下来,从而避免去重复计算。
418 0
详细实例说明+典型案例实现 对动态规划法进行全面分析 | C++
|
人工智能 算法 Java
详细实例说明+典型案例实现 对递归法进行全面分析 | C++
在上面,我们通过一个生活中的实例以及两个递归的典型问题,去详细的分析了递归法的核心思想和在程序中的具体实现过程。从程序设计语言的角度来说,谈到递归的定义,可以这样来描述:假如一个函数或子程序是由它自身所定义或调用的,就称它为递归。它至少要定义两个条件,一个是可以反复执行的递归过程,另一个是跳出执行过程的出口。
308 0
详细实例说明+典型案例实现 对递归法进行全面分析 | C++
|
算法 C++
用详细实例说明和典型案例实现对分治法进行全面分析 | C++
简单的来说,算法就是用计算机程序代码来实现数学思想的一种方法。学习算法就是为了了解它们在计算机中如何演算,以及在当今的信息时代,它们是如何在各个层面上影响我们的日常生活的,从而提高我们的逻辑思维能力和处理实际问题的能力。善用算法、巧用算法,是培养程序设计逻辑的重中之重,许多实际的问题都可用多个可行的算法来解决, 但是要从中找出最优的解决算法却是一项挑战。
169 0
用详细实例说明和典型案例实现对分治法进行全面分析 | C++