Проверка правильности расстановки скобок - C (СИ)
Формулировка задачи:
#include <stdio.h>
#include <stdlib.h>
#include<locale.h>
struct stack
{
int size;//размер стека
char * st;//добавляем эл в стек
};
struct stack s;
void push(char hell)
{
if(s.size == 0 && s.st == NULL)
{
s.size++;
s.st = (char*)malloc(sizeof(char)*s.size);
s.st[s.size-1] = hell;//добавляем в стек один эл
}
else
{
char * tmp = s.st;
s.size++;
s.st = (char*)malloc(sizeof(char)*s.size);
int i;
for(i=0;i<s.size-1;i++)
{
s.st[i] = tmp[i];
}
free(tmp);
s.st[s.size-1] = hell;
}
}
char pop(){
char ch = s.st[s.size-1];//сохраняем верхний элемнт стека
s.st[s.size-1] = '\0';
s.size--;
return ch;
}
int main()
{
setlocale(LC_ALL,"RUS");
char*m = (char*)malloc(sizeof(char*)*10);// малок выделяет память в 10 символов,сайзоф возвращает число байтов для чара это 1 байт
char*temp;
char c = 0;//переменая для ввода символов (с это один символ)
int i=-1,n=0,t=0;//n- испульзуем для выделения памяти,i-значение массива(i может быть от 0 до 9,а кол-во значениий 10)
//t- проходит по старому массиву и вставляет его в новый
printf("Введите значение:\n");
//scanf("%s",&m);
while(c!='\n')
{
i++;
c=getchar();//считывает один символ из потока ввода
m[i+n]=c;
if(i==9)//если строка превышает 10 симв
{
n=n+i+1;//предыдущщее кол-во элементов массива
i=-1;//т.к массив начинается с нуля
temp=m;//новый массив
char* m = (char*)malloc(sizeof(char*)*(n+10));//увеличиваем рахмер на 10
for(t=0;t<n+1;t++)
m[t]=temp[t];//t- проходит по старому массиву и вставляет его в новый
}
}
m[i+n] = '\0';
int j,ok=1,k;//Переменная OK чтобы выйти из внешнего цикла,=0, если в стеке скобка другого типа или стек пуст.
char z;
char br1[3] = { '(', '[', '{' };
char br2[3] = { ')', ']', '}' };
for(j=0;ok &&(*m != '\0');j++)
for (k=0;k<3;k++)
{
if(*m==br1[k])
{
push(*m);
m++;
break;
}
if(*m==br2[k])
{
z=pop(*m);
if (z!=br1[k] )
ok=0;
m++;
break;
}
}
if ( ok && (*m == 0) )
printf("\nВыpажение пpавильное\n");
else printf("\nВыpажение непpавильное \n");
free(m);
free(s.st);
return 0;
}
помогите,не пойму что не так,не судите строго,я начинающий)
Решение задачи: «Проверка правильности расстановки скобок»
textual
Листинг программы
/*
Напишите программу, которая проверяет правильность скобочной структуры,
составленной из нескольких типов скобок (круглых, квадратных и фигурных).
Например, ({()[]}) — правильная структура, а ({()[)}] — неправильная.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <windows.h>
typedef struct _INFO
{
char s;
struct _INFO *next;
}INFO;
typedef INFO *STACK;
int Push( STACK *stack, char s )
{
INFO *temp = (INFO*)malloc( sizeof(INFO));
temp->s = s;
if( !temp ) return 1;
if( !*stack )
temp->next = NULL;
else
temp->next = *stack;
*stack = temp;
return 0;
}
int Pop( STACK *stack, char *s )
{
if( !*stack ) return 1;
INFO *temp = *stack;
*s = temp->s;
*stack = temp->next;
free( temp );
return 0;
}
int main( int argc, char *argv[] )
{
SetConsoleCP( 1251 );
SetConsoleOutputCP( 1251 );
STACK head = NULL;
bool flag = true;
printf( "Введите строку из скобок (){}[]\n" );
char s, s_1;
while( (s = getchar()) != '\n')
{
if( s == '(' || s == '{' || s == '[' )
{
Push( &head, s );
}
if( s == ')' || s == '}' || s == ']' )
{
if( !head ) { flag = false; break; }
if ( head->s == '(' && s == ')' ) Pop( &head, &s_1 );
else if ( head->s == '[' && s == ']' ) Pop( &head, &s_1 );
else if ( head->s == '{' && s == '}' ) Pop( &head, &s_1 );
}
}
if( !head && flag)
printf( "Правильная скобочная последовательность\n" );
else
printf( "Неправильная скобочная последовательность.\n" );
return 0;
}
Объяснение кода листинга программы
- Вводится строка из скобок (){}[]
- Создается пустая стек-структура для работы со скобками
- В цикле считываются символы по одному
- Если считанный символ является открывающей скобкой (), { или [), то он добавляется в стек
- Если считанный символ является закрывающей скобкой ), } или ], то происходит проверка:
- Если стек пуст, то выставляется флаг ошибки и цикл прерывается
- Если в стеке есть соответствующая открывающая скобка, то она удаляется из стека, а закрывающая скобка обрабатывается следующим циклом
- После окончания ввода символов происходит проверка:
- Если стек пуст и флаг ошибки не установлен, то выводится сообщение о правильной скобочной последовательности
- В противном случае выводится сообщение о неправильной скобочной последовательности.