kavinderrana121 Ответов: 2

C программа для проверки балансировки парантеза


Я сделал c proram ,чтобы проверить балансировку paranthesis ,и он не показывает никакой ошибки и никакого предупреждения, но я не получаю никакого вывода, пожалуйста, это будет действительно полезно, если вы, ребята, можете помочь мне, я новичок в программировании
К сведению, у меня есть сомнения в функции checkbalanced все кажется правильным для меня

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

 #include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
 struct Stack{
 int top;
 int capacity;
 int *array;
 };
 struct Stack* createstack(int capacity){
 struct Stack* stack=(struct Stack*)malloc(sizeof(struct Stack));
 if(!stack)
   return NULL;
 stack->top=-1;
 stack->capacity=capacity;

stack->array=(int*)malloc(sizeof(int)*stack->capacity);
if(!stack->array)
  return NULL;
return stack;
}
int isempty(struct Stack* stack){
return stack->array[stack->top--];
}
char pop(struct Stack* stack){
return stack->array[stack->top--];

}
void push(struct Stack* stack,char exp){

stack->array[++stack->top]=exp;

}
char peek(struct Stack* stack){

return stack->array[stack->top];

}

функция проверки соответствия парантеза в верхней части стека и exp[i]
int ismatchingpair(char char1,char char2){
if(char1=='('&&char2==')')
   return 1;
if(char1=='['&&char2==']')
   return 1;
if(char1=='{'&&char2=='}')
   return 1;
return 0;
}

функция проверки балансировки парантеза
int checkBalanced(char *exp){

struct Stack* stack=createstack(strlen(exp));
if(!stack)
  return NULL;

 for(int i=0;exp[i];++i){
if(exp[i]=='('||exp[i]=='{'||exp[i]=='[')
  push(stack,exp[i]);
else if(exp[i]==')'||exp[i]=='}'||exp[i]==']')
{
 if(isempty(stack)||!ismatchingpair(peek(stack),exp[i]))
     return -1;

 else
     pop(stack);

 }
 }
 printf("parenthesis are balanced");


 }

основная функция
int main()
{
char exp[50]="(){}";

checkBalanced(exp);
 return 0;

}

2 Ответов

Рейтинг:
2

Patrice T

Похоже, что isempty и pop делают то же самое в вашем коде.

int isempty(struct Stack* stack){
	return stack->array[stack->top--];
}

char pop(struct Stack* stack){
	return stack->array[stack->top--];
}

Цитата:
Он не показывает ни ошибки, ни предупреждения, но я не получаю никаких выходных данных

Во-первых: измените свой код, чтобы всегда иметь выход, а не только на успех.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

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

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

Вторичное воздействие
- Вы будете гордиться тем, что сами находите Жуков.
- Ваши навыки обучения улучшатся.

Вы должны довольно быстро найти, что не так.

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

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
-----
Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stack{
	int top;
	int capacity;
	int *array;
};
struct Stack* createstack(int capacity){
	struct Stack* stack=(struct Stack*)malloc(sizeof(struct Stack));
	if(!stack)
		return NULL;
	stack->top=-1;
	stack->capacity=capacity;

	stack->array=(int*)malloc(sizeof(int)*stack->capacity);
	if(!stack->array)
		return NULL;
	return stack;
}

int isempty(struct Stack* stack){
	return stack->array[stack->top--];
}

char pop(struct Stack* stack){
	return stack->array[stack->top--];
}

void push(struct Stack* stack,char exp){
	stack->array[++stack->top]=exp;
}

char peek(struct Stack* stack){
	return stack->array[stack->top];
}

int ismatchingpair(char char1,char char2){
	if(char1=='('&&char2==')')
		return 1;
	if(char1=='['&&char2==']')
		return 1;
	if(char1=='{'&&char2=='}')
		return 1;
	return 0;
}

int checkBalanced(char *exp){

	struct Stack* stack=createstack(strlen(exp));
	if(!stack)
		return NULL;

	for(int i=0;exp[i];++i){
		if(exp[i]=='('||exp[i]=='{'||exp[i]=='[')
			push(stack,exp[i]);
		else if(exp[i]==')'||exp[i]=='}'||exp[i]==']')
		{
			if(isempty(stack)||!ismatchingpair(peek(stack),exp[i]))
				return -1;
			else
				pop(stack);
		}
	}
	printf("parenthesis are balanced");
}

int main()
{
	char exp[50]="(){}";

	checkBalanced(exp);
	return 0;
}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]


Рейтинг:
0

Jochen Arndt

Ваш isempty() функция модифицирует стек:

int isempty(struct Stack* stack){
    return stack->array[stack->top--];
}
Это фактически поп-операция. Таким образом, цикл выражения завершается до достижения конца строки. Поскольку вы не печатаете в этом случае, у вас нет вывода.

Наверное так и должно быть
int isempty(const struct Stack* stack){
    return stack->top < 0;
    /* Or with NULL pointer check: */
    return !stack || stack->top < 0;

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