正在载入交互式动画窗口请稍等

栈-括号匹配-顺序表 可视化交互式动画版

图码-数据结构可视化动画版

给定一个表达式字符串 exp ,编写一个程序来检查给定表达式中“{”, “}”, “(”, “)”, “[”, “]”的对和顺序是否正确。

示例 : 

输入 :exp = “[()]{}{[()()]()}” 
输出 :Balanced
解释: 所有括号格式正确

输入 :exp = “[(])” 
输出 :Not Balanced 
解释:1 4 括号不平衡,因为 
在右括号 '(' 之前有一个右括号 ']'

使用Stack 检查平衡括号表达式

这个想法是将所有左括号放入堆栈中。 每当您击中右括号时,请搜索堆栈顶部是否是相同性质的左括号。 如果成立,则弹出堆栈并继续迭代。 最后如果堆栈为空,则意味着所有括号都是平衡的或格式良好的。 否则,它们就不平衡。

插图: 
下面是上述方法的插图。

请按照下面提到的步骤来实现这个想法:

  • 声明一个字符 堆栈 (例如 temp )。
  • 现在遍历字符串exp。 
    • 如果当前字符是起始括号( '(' 或 '{' 或 '[' ),则将其压入堆栈。
    • 如果当前字符是右括号( ')' 或 '}' 或 ']' ),则从堆栈中弹出,如果弹出的字符是匹配的起始括号,则可以。
    • 否则括号 不平衡
  • 完成遍历后,如果堆栈中留下一些起始括号,则表达式为 Not Balanced ,否则为 Balanced

下面是上述方法的实现:

C++

// C++ program to check for balanced brackets.
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to check if brackets are balanced
bool areBracketsBalanced(string expr)
{
    // Declare a stack to hold the previous brackets.
    stack<char> temp;
    for (int i = 0; i < expr.length(); i++) {
        if (temp.empty()) {
             
            // If the stack is empty
            // just push the current bracket
            temp.push(expr[i]);
        }
        else if ((temp.top() == '(' && expr[i] == ')')
                 || (temp.top() == '{' && expr[i] == '}')
                 || (temp.top() == '[' && expr[i] == ']')) {
             
            // If we found any complete pair of bracket
            // then pop
            temp.pop();
        }
        else {
            temp.push(expr[i]);
        }
    }
    if (temp.empty()) {
         
        // If stack is empty return true
        return true;
    }
    return false;
}
 
// Driver code
int main()
{
    string expr = "{()}[]";
 
    // Function call
    if (areBracketsBalanced(expr))
        cout << "Balanced";
    else
        cout << "Not Balanced";
    return 0;
}


            

C

Java

Python3

C#

JavaScript

输出

均衡

时间复杂度: O(N),对大小为 N 的字符串迭代一次。
辅助空间: 堆栈的 O(N)。 

在不使用堆栈的情况下检查平衡括号表达式:

以下是应遵循的步骤:

  • -1 初始化变量 i
  • 遍历字符串并 
    • 如果它是左括号,则将计数器加 1,并将 字符串中的 第 i 个字符替换为左括号。
    • 否则,如果它是相同的相应左括号(左括号存储在 exp[i] 中)的右括号,则将 i 减1。
  • 最后,如果我们得到 i = -1 ,那么字符串是平衡的,我们将返回 true。 否则,该函数将返回 false。

下面是上述方法的实现:

C++

#include <iostream>
 
using namespace std;
 
 bool areBracketsBalanced(string s) {
        int i=-1;
        for(auto& ch:s){
            if(ch=='(' || ch=='{' || ch=='[')
                s[++i]=ch;
            else{
                if(i>=0 && ((s[i]=='(' && ch==')') || (s[i]=='{' && ch=='}') || (s[i]=='[' && ch==']')))
                    i--;
                else
                    return false;
            }
        }
        return i==-1;
    }
 
int main()
{
    string expr = "{()}[]";
 
    // Function call
    if (areBracketsBalanced(expr))
        cout << "Balanced";
    else
        cout << "Not Balanced";
    return 0;
}


            

Java

C#

Python3

JavaScript

输出

均衡

时间复杂度 :O(N),对大小为 N 的字符串迭代一次。
辅助空间 :O(1)


无论你的目标是考试成功、职业发展,还是纯粹的兴趣,这个数据结构和算法可视化的网站都会是一个无价的资源。

前往这个网站,开始你的学习之旅吧!

这些是常见的:【C语言描述】《数据结构和算法》数据结构JAVA实现 数据结构与算法基础(青岛大学-王卓)数据结构与算法王道数据结构c语言实现 速成数据结构期末考前救急 数据结构视频C语言版教程 数据结构严蔚敏 数据结构郝斌 数据结构考研 JAVA数据结构算法与基础 数据结构王道 2022数据结构学习 数据结构小甲鱼 王卓 学习数据结构 数据结构浙江大学 数据结构复习 数据结构马士兵 数据结构零基础教程 数据结构和算法 数据结构入门 考研数据结构习题讲解 数据结构期末复习 计算机二级