【问题标题】:C++ program for checking a string for balanced ()s, {}s and []s用于检查字符串是否平衡 ()、{} 和 [] 的 C++ 程序
【发布时间】:2012-09-27 06:00:08
【问题描述】:

这是我的问题:

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

例如:“{ { [ ( ) ] } ( ) }” 以应有的平衡 (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;
}

【问题讨论】:

  • 提示:使用堆栈数据结构(例如std::stack&lt;char&gt;)。
  • 另一个提示:想象你被允许沿着字符串来回走动,当你选择时擦除字符......

标签: c++ brackets parentheses curly-braces


【解决方案1】:

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

流程是

  • 如果令牌是开放令牌,则将其压入堆栈。
  • 如果令牌是关闭令牌,检查栈顶是否是对应的开放令牌。如果是,则在发现它们平衡时弹出堆栈。如果不是,那就是错误。

【讨论】:

    【解决方案2】:

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

    1. 始终初始化变量。字符串未在您的代码中初始化。
    2. 您不会对字符串进行三次迭代,您只能检查一次字符串。
    3. 使用 if-else if-else 结构而不是 if-if-if 结构。
    4. 始终使用方括号
    5. 与您的用法保持一致,使用 at() 或 [],但不要在代码中混用它们。

    【讨论】:

    • 默认构造的std::string 非常好。
    【解决方案3】:
    //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;
    }
    

    【讨论】:

      【解决方案4】:
      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;
      
      }
      

      【讨论】:

        【解决方案5】:
        #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;
        }
        

        【讨论】:

        • 您是否针对帖子中的示例({ ( [ ] } ))进行了测试?看起来您的代码无法处理该问题。
        【解决方案6】:
        //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-02-03
          • 2013-02-02
          • 2013-02-02
          • 2018-06-23
          • 1970-01-01
          • 2021-06-05
          • 2015-03-19
          • 2013-12-28
          • 2011-11-04
          相关资源
          最近更新 更多