C++用于检查平衡 ()s、{} 和 []s 字符串的程序

C++ program for checking a string for balanced ()s, {}s and []s

本文关键字:字符串 程序 检查 用于 平衡 C++      更新时间:2023-10-16

这是我的问题:

我应该编写一个 c++ 程序来检查字符串是否平衡。到目前为止,我让代码工作以确保它具有相同数量的 ('s 和 )(与 ['s 和 {'s 相同)。问题是这几乎适用于所有内容,但它不适用于 {'s、('s 和 ['s 都混淆的字符串。

例如:"{ { [ ( ) ] } ( ) }" 返回时应为平衡 (true)。但是,"{ ( [ ] } )"会恢复为真,但不应该。

逻辑和/或代码中的哪些想法会在它们出现故障时进行检查?

感谢您的任何帮助!

如果有帮助,我的代码如下:

bool ExpressionManager::isBalanced(string expression)
{
//remove whitespace
string edited;
for(int i = 0; i < expression.length(); i++)
{
    if(expression[i] == ' ')
    {
        continue;
    }
    else
    {
        edited += expression[i];
    }
}
expression = edited;
//set up brckets 
string brackets;
for(int i = 0; i < expression.length(); i++)
{
    if (expression.at(i)=='(')
    {
        brackets += expression.at(i);
    }
    if (expression.at(i)=='[')
    {
        brackets += expression.at(i);
    }
    if (expression.at(i)=='{')
    {
        brackets += expression.at(i);
    }
    if (expression.at(i)=='}')
    {
        brackets += expression.at(i);
    }
    if (expression.at(i)==']')
    {
        brackets += expression.at(i);
    }
    if (expression.at(i)==')')
    {
        brackets += expression.at(i);
    }
}
int parenbal = 0;
int brackbal = 0;
int mustachebal = 0;
    for (int i = 0; i<(brackets.size());i++)
    {
        if(brackets[i]=='(')
            parenbal++;
        if(brackets[i]=='[')
            brackbal++;
        if(brackets[i]=='{')
            mustachebal++;
        if(brackets[i]==')')
            parenbal--;
        if(brackets[i]==']')
            brackbal--;
        if(brackets[i]=='}')
            mustachebal--;
    }
    bool isbalanced = false;
    if ((mustachebal==0)&&(brackbal==0)&&(parenbal==0))
    {
        isbalanced = true;
    }
    //check for brackets mixed up with other stuff.

return isbalanced;
}

如果您使用 Stack 来存储这些令牌,那么您总是在寻找对应于堆栈顶部的关闭对应物或开放令牌。

流程将是

  • 如果令牌是开放令牌,请将其推送到堆栈上。
  • 如果令牌是
  • 关闭令牌,请检查堆栈顶部是否是相应的开放令牌。如果是,那么当您发现它们平衡时弹出堆栈。如果不是,则为错误。

似乎更像是家庭作业。因此,我会相应地发表评论,并让您学到一些东西。

  1. 始终初始化变量。 字符串不会在代码中初始化。
  2. 您不会迭代字符串三次,只能检查一次字符串。
  3. 使用 if-else
  4. if-else 结构而不是 if-if-if 结构。
  5. 始终使用括号大括号
  6. 与您的用法保持一致,使用 at() 或 [],但不要在代码中混合使用它们。
//this code may help you check string for balanced brackets with no
//repeated brackets,paranthesis or braces (e.g. [2*{3/(1+2)}].Note: no repeatance of
//brackets
#include <iostream.h>
#include <conio.h>
#include "IntStack.h"
#include <stdio.h>
void main(void)
{
    char bracket[20];
    gets (bracket);
    char arr[6];
    int i=0;
    while(i<20)
    {
        switch(bracket[i])
            {
                case '[':
                {
                    arr[0]=1;
                    break;
                }
                case '{':
                {
                    arr[1]=2;
                    break;
                }
                case '(':
                {
                    arr[2]=3;
                    break;
                }
                case ')':
                {
                    arr[3]=3;
                    break;
                }
                case '}':
                {
                    arr[4]=2;
                    break;
                }
                case ']':
                {
                    arr[5]=1;
                    break;
                }
                default:
                    cout<<"";
        }
        i++;
    }
    if(arr[3]==arr[2])
        cout<<"";
    else
        cout<<" ) or ( is missing "<<endl;
    if(arr[1]==arr[4])
        cout<<"";
    else
        cout<<" } or { is missing "<<endl;
    if(arr[5]==arr[0])
        cout<<"";
    else
        cout<<" ] or [ is missing"<<endl;
}
void check_brackets (string bituy) 
{
    int flag = 1
    int count[6] = {0, 0, 0, 0, 0, 0};
    stack<char> barstack;
    for (int i = 0; i < bituy.length(); i++)
    {
        if (bituy[i] == '{')
            count[0]++;
        else if (bituy[i] == '}')
            count[1]++;
        else if (bituy[i] == '(')
            count[2]++;
        else if (bituy[i] == ')')
            count[3]++;
        else if (bituy[i] == '[')
            count[4]++;
        else if (bituy[i] == ']')
            count[5]++;
    }
    for (int i = 0; i < 6; i += 2)
    {
        if (count[i] != count[i+1])
        {
            cout << "Wrong Syntax!" << endl;
            flag = 0;
            break;
        }
    }
    if (flag)
    {
        for (int i = 0; i < bituy.length(); i++)
        {
            if (bituy[i] == '{' || bituy[i] == '(' || bituy[i] == '[')
                barstack.push(bituy[i]);
            else
            {
                if ((barstack.top() == '{' && bituy[i] == '}') || (barstack.top() == '(' && bituy[i] == ')') || (barstack.top() == '[' && bituy[i] == ']'))
                    barstack.pop();
                else
                {
                    cout << "Wrong Syntax!" << endl;
                    flag = 0;
                    break;
                }
            }
        }
    }
    if (flag)
        cout << "No Errors!" << endl;
}
#include<bits/stdc++.h>
using namespace std;
bool isBalance(char n[],int size){
    int i,count=0;
    //int size=strlen(n);
    for(i=0;i<size;i++){
        if(n[i]=='{'||n[i]=='['||n[i]=='('){
            count ++;
           }
           else if(n[i]=='}'||n[i]==']'||n[i]==')'){
            count --;
           }
           else return -1;
    }
    if(count==0)
        return true;
    else
        return false;
}
int main(){
    char n[1000];
    gets(n);
    int size=strlen(n);
    bool result=isBalance(n,size);
    if(result==true)
        cout<<"Balance";
    else
        cout<<"Not Balance";
    return 0;
}
//bracket Chaecker program
void bracket_checker()
{
    int i=0;
    char d;
    char ch;
    int count=0;
    char *s = new char[21];
    fstream out;
    out.open("brace.txt",ios::in);
    while(out>>d)
        {
                if(d =='}'|| d ==')' || d == '{' || d =='(')
                {
                s[i]=d;
                i++;
                }
        }
    if (i % 2 != 0)
    cout <<"ninvalid braces";
    else if (( s[0] == '}' || s[0]==')' || s[0]==']') || (s[i]=='{' || s[i]=='(' || s[i]=='[' ))
    cout <<"n invalid braces";
    else
    {
        for(int a=0; a<i; a++)
        {
                if (s[a] == '(' || s[a] == '{' || s[a] =='[' )
                push1(s[a]);
                if((s[a]=='(' && (s[a+1]=='{' || s[a+1]=='}')) || (s[a]=='[' && (s[a+1]=='{' || s[a+1]=='}')))
                break;
                else
                if (s[a] == ')' || s[a] == '}' )
                {
                        if (head != NULL)
                    {
                        ch = pop1();
                        if( ch == '{' && s[a] == '}' || ch == '(' && s[a] == ')' || ch=='[' && s[a]==']')
                        cout <<" ";
                        else
                        break;
                    }
                else
                break;
                }
        }
                if(head==NULL)
                    cout <<" valid";
                else 
                    cout <<"In Valid";
    }

}