3

所以这是我的问题:

我应该编写一个 C++ 程序来检查字符串是否平衡。到目前为止,我的代码正在工作以确保它具有相同数量的 ('s 和 )'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;
}
4

6 回答 6

5

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

流量将是

  • 如果令牌是开放令牌,则将其压入堆栈。
  • 如果令牌是关闭令牌,则检查堆栈顶部是否是相应的打开令牌。如果是,则在发现它们平衡时弹出堆栈。如果不是,那么这是一个错误。
于 2012-10-06T05:48:03.713 回答
0
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;

}
于 2013-11-16T18:52:02.770 回答
0
//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;
}
于 2013-02-20T18:33:34.573 回答
0

看起来更像是家庭作业。所以我会做出相应的评论,让你学习一些东西。

  1. 始终初始化您的变量。字符串未在您的代码中初始化。
  2. 您不会对字符串进行三次迭代,您只能检查一次字符串。
  3. 使用 if-else if-else 结构而不是 if-if-if 结构。
  4. 始终使用方括号
  5. 与您的用法保持一致,使用 at() 或 [],但不要在代码中混合使用它们。
于 2012-10-06T06:09:38.327 回答
0
#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;
}
于 2016-08-24T23:36:34.677 回答
-1
//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";
    }


}
于 2013-04-06T05:08:11.110 回答