Мы, начинающие, должны помогать друг другу. :)
Я выполняю ваше задание впервые в жизни .:)
Для начинающих всегда используйте английские слова sh идентификаторы. В противном случае текст программы может быть нечитаемым.
Непонятно, почему элемент данных x
имеет тип int
вместо char
, хотя стек работает с символами строки.
struct stog {
int x;
stog *sljedeci;
};
Тем не менее, вы не показали всю реализацию стека, например, функция pop
недействительна. Это приводит к утечке памяти.
Сначала вы выделили память и ее адрес, назначенный указателю temp
, и сразу же в следующей строке вы переназначили указатель. Таким образом, выделенная память не будет освобождена.
temp = (stog*)malloc(sizeof(stog));
temp = top;
Этот оператор
top->x = temp->sljedeci->x;
может вызывать неопределенное поведение, если top
равно NULL
.
Также в функции Brackets
этот оператор if
if (msg[i]==')'){
z = pop();
printf("Bad\n");
}
не имеет смысла. Функция всегда будет выводить "Bad"
, как только встретится символ ')'
.
Вот решение, которое я сделал.
#include <stdio.h>
#include <stdlib.h>
struct stack
{
char c;
struct stack *next;
};
char * top( struct stack **stack )
{
return *stack == NULL ? NULL : &( *stack )->c;
}
int push( struct stack **stack, char c )
{
struct stack *current = malloc( sizeof( struct stack ) );
int success = current != NULL;
if ( success )
{
current->c = c;
current->next = *stack;
*stack = current;
}
return success;
}
void pop( struct stack **stack )
{
if ( *stack )
{
struct stack *current = *stack;
*stack = ( *stack )->next;
free( current );
}
}
int empty( struct stack **stack )
{
return *stack == NULL;
}
void clear( struct stack **stack )
{
while ( *stack ) pop( stack );
}
int bracket_balance( const char *s )
{
struct stack *stack = NULL;
int balanced = 1;
for ( ; *s && balanced; ++s )
{
if ( *s == '(' )
{
push( &stack, *s );
}
else if ( *s == ')' )
{
if ( ( balanced = !empty( &stack ) && *top( &stack ) == '(' ) )
{
pop( &stack );
}
}
}
balanced = balanced && empty( &stack );
clear( &stack );
return balanced;
}
int main(void)
{
const char * s[] =
{
"", "(", ")", "()", ")(", "( ( ) )", "( )( )", "( ) ) (", "Hello"
};
for ( size_t i = 0; i < sizeof( s ) / sizeof( *s ); i++ )
{
if ( bracket_balance( s[i] ) )
{
printf( "\"%s\" has balanced brackets\n", s[i] );
}
else
{
printf( "\"%s\" does not have balanced brackets\n", s[i] );
}
}
return 0;
}
Вывод программы:
"" has balanced brackets
"(" does not have balanced brackets
")" does not have balanced brackets
"()" has balanced brackets
")(" does not have balanced brackets
"( ( ) )" has balanced brackets
"( )( )" has balanced brackets
"( ) ) (" does not have balanced brackets
"Hello" has balanced brackets