Проверка правильности расстановки скобок - 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;
}

Объяснение кода листинга программы

  1. Вводится строка из скобок (){}[]
  2. Создается пустая стек-структура для работы со скобками
  3. В цикле считываются символы по одному
  4. Если считанный символ является открывающей скобкой (), { или [), то он добавляется в стек
  5. Если считанный символ является закрывающей скобкой ), } или ], то происходит проверка:
    • Если стек пуст, то выставляется флаг ошибки и цикл прерывается
    • Если в стеке есть соответствующая открывающая скобка, то она удаляется из стека, а закрывающая скобка обрабатывается следующим циклом
  6. После окончания ввода символов происходит проверка:
    • Если стек пуст и флаг ошибки не установлен, то выводится сообщение о правильной скобочной последовательности
    • В противном случае выводится сообщение о неправильной скобочной последовательности.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5
Похожие ответы