скобки — программа C ++ для проверки строки для сбалансированных () s, {} s и [] 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;
}

3

Решение

Если вы нанимаете стек чтобы хранить эти токены, вы всегда ищете закрывающий аналог, соответствующий тому, что находится на вершине стека, или открытый токен.

Поток будет

  • Если токен является открытым токеном, поместите его в стек.
  • Если токен является близким токеном, проверьте, является ли вершина стека соответствующим открытым токеном. Если это так, то вытолкните стек, как вы нашли их сбалансированными. Если это не так, то это ошибка.
5

Другие решения

Похоже, домашнее задание. Поэтому я бы прокомментировал и позволил вам узнать несколько вещей.

  1. Всегда инициализируйте свои переменные. строки не инициализируются в вашем коде.
  2. Вы не перебираете строку три раза, вы можете проверить строку только один раз.
  3. Используйте структуру if-else if-else вместо структуры if-if-if.
  4. Всегда используйте скобки скобки
  5. Будьте совместимы с вашим использованием, используйте at () или [], но не смешивайте их в коде.
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;
}
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;

}
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;
}
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";
}}
-1