3

だからここに私の問題があります:

文字列のバランスをチェックする C++ プログラムを作成することになっています。これまでのところ、同じ数の ( と ) があることを確認するコードが動作しています ([ と { と同じ)。問題は、これがほとんどすべての場合に機能することですが、{、(、および [ がすべて混同されている文字列には機能しません。

例: "{ { [ ( ) ] } ( ) }" は、本来あるべきバランス (true) として返されます。ただし、「{ ( [ ] } )」は 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
#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 に答える
0

宿題のようです。したがって、それに応じてコメントし、いくつかのことを学ぶことができます。

  1. 常に変数を初期化してください。文字列はコードで初期化されません。
  2. 文字列を 3 回反復処理するのではなく、文字列を 1 回だけチェックできます。
  3. if-if-if 構造の代わりに if-else if-else 構造を使用します。
  4. 常にブラケットブレースを使用する
  5. at() または [] のいずれかを使用しますが、コード内でそれらを混在させないでください。
于 2012-10-06T06:09:38.327 に答える
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
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 に答える
-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 に答える