Проверка правильности расстановки скобок - 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; }
Объяснение кода листинга программы
- Вводится строка из скобок (){}[]
- Создается пустая стек-структура для работы со скобками
- В цикле считываются символы по одному
- Если считанный символ является открывающей скобкой (), { или [), то он добавляется в стек
- Если считанный символ является закрывающей скобкой ), } или ], то происходит проверка:
- Если стек пуст, то выставляется флаг ошибки и цикл прерывается
- Если в стеке есть соответствующая открывающая скобка, то она удаляется из стека, а закрывающая скобка обрабатывается следующим циклом
- После окончания ввода символов происходит проверка:
- Если стек пуст и флаг ошибки не установлен, то выводится сообщение о правильной скобочной последовательности
- В противном случае выводится сообщение о неправильной скобочной последовательности.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д