M.Gehad Ответов: 2

[С++] У меня есть проблема с кодом C++


я думаю, что проблема в паре [bool]
но я никак не мог ее решить
пожалуйста, помогите мне

[^]

#include<iostream>
#include<string>
using namespace std;
struct stack{
int arr[100];
int top=-1;
void push(int val){
if(top==99)return;
top++;
arr[top]=val;
}
void pool(){
if(is_empty())return;
top--;
}
int top_val(){
if(is_empty())return -1;
return arr[top];
}
bool is_empty(){
if(top==-1)return true;
else return false;
}
};
bool pair(char open,char close){
if(open=='('&&close==')') return true;
else if(open=='['&&close==']') return true;
else if(open=='{'&&close=='}') return true;
return false;
}
bool balance(string exp){
stack bracket;
for(int i=1;i<=exp.length();i++){
if(exp=='('||exp=='['||exp=='{'){
bracket.push(exp);
}
else if (exp==')'||exp==']'||exp=='}'){
if(bracket.is_empty())return false;
else if(pair(bracket.top_val(),exp)==false) return false;
bracket.pool();
}
if(bracket.is_empty())return true ;
else return false;
}
}
int main(){
string s;
cin>>s;
if(balance(s))cout<<"the brackets is balance \n";
else cout<<"the brackets isn't balance";
}


Что я уже пробовал:

я думаю, что проблема в паре [bool]
но я никак не мог ее решить
пожалуйста, помогите мне

Leo Chapiro

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

2 Ответов

Рейтинг:
9

Jochen Arndt

Вы не сказали нам, какая у вас проблема.

Но ваш код будет выдавать ошибки компиляции, которые вы должны проверить, чтобы исправить свой код.

Просто взгляните на эту часть кода (которую я правильно отформатировал, чтобы сделать ее читабельной):

bool balance(string exp)
{
    stack bracket;
    for (int i = 1; i <= exp.length(); i++){
        if (exp == '(' || exp == '[' || exp == '{'){
            bracket.push(exp);
        }
        else if (exp == ')' || exp == ']' || exp == '}'){
            if (bracket.is_empty())
                return false;
            else if (pair(bracket.top_val(),exp) == false) 
                return false;
            bracket.pool();
        }
        if (bracket.is_empty())
            return true ;
        else 
            return false;
    }
}

exp иметь тип std::string. Вы не можете сравнить такое с chars (символы, заключенные в одинарные кавычки, например '(' иметь тип char). То же самое относится и к вызову bracket.push(exp) что ожидает int в качестве аргумента вместо std::string.

Вы, вероятно, хотите перебрать символы в вашем списке. exp строка. Используйте string::operator[] - ссылка на C++ [^] для доступа к отдельным символам в заданной позиции.

При этом вы можете распознать следующую ошибку. В C/C++ индексы основаны на нуле. Таким образом, вы должны выполнить итерацию, начиная с нуля до - но исключая - длину строки. См.также пример кода из приведенной выше ссылки.

Обратите также внимание, что функция всегда возвращается в цикле. Это логическая ошибка, которая обычно не обнаруживается компилятором, но приводит к неправильным выводимым результатам.


Рейтинг:
13

Patrice T

Совет: научитесь делать отступы в своем коде, это поможет чтению. Комментарии-это тоже хорошая идея.
Не пакуйте вещи на одной линии, это просто сделает вещи более запутанными без какой-либо выгоды.

#include<iostream>
#include<string>
using namespace std;
struct stack{
	int arr[100];
	int top=-1;
	void push(int val){
		if(top==99)return;
		top++;
		arr[top]=val;
	}
	void pool(){
		if(is_empty())return;
		top--;
	}
	int top_val(){
		if(is_empty())return -1;
		return arr[top];
	}
	bool is_empty(){
		if(top==-1)return true;
		else return false;
	}
};
bool pair(char open,char close){
	if(open=='('&&close==')') return true;
	else if(open=='['&&close==']') return true;
	else if(open=='{'&&close=='}') return true;
	return false;
}
bool balance(string exp){
	stack bracket;
	for(int i=1;i<=exp.length();i++){
		if(exp=='('||exp=='['||exp=='{'){
			bracket.push(exp);
		}
		else if (exp==')'||exp==']'||exp=='}'){
			if(bracket.is_empty())return false;
			else if(pair(bracket.top_val(),exp)==false) return false;
			bracket.pool();
		}
		if(bracket.is_empty())return true ;
		else return false;
	}
}
int main(){
	string s;
	cin>>s;
	if(balance(s))cout<<"the brackets is balance \n";
	else cout<<"the brackets isn't balance";
}

Профессиональные редакторы программистов имеют эту функцию наряду с другими полезными.
Блокнот++ Главная Страница[^]
UltraEdit | Оригинальный Текстовый Редактор[^]
Цитата:
я думаю, что проблема в паре [bool]

Отладка кода-это не вопрос догадок, используйте отладчик и посмотрите, как работает ваш код.
Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


M.Gehad

я попробую отладчик прямо сейчас