Пример Дана строка символов. Проверьте правильность расстановки в ней круглых скобок - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Если скобок больше справа, то все работает(т.к условие прописано). Но вот не пойму как прописать условие для скобок больше слева. Получается стек должен быть пуст, но не пойму как реализовать. Заранее спасибо хоть за какие-то подсказки Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
 
struct stack
{
    char value;
    stack *next;
};
 
void main()
{
    stack *stk, *tek;
    int i, flag=0;
    int count;
    setlocale(LC_ALL, "RUS");
    char text[255];
    gets(text);
    for(i=0; i<strlen(text); i++)
    {
        if(text[i] == '(')
        {
            stk = NULL;
            tek = new (stack);
            (*tek).value = text[i];
            (*tek).next = stk; 
            stk = tek;
        }
        if(text[i] == ')')
        {
            if((*tek).value == '(')
            {
                    tek = stk;
                    stk = (*stk).next;
                    delete tek;
                    flag = 1;
                    printf("flag1\n");
            }
            else //Если скобок больше справа
            {
                flag = 0;
                printf("flag0\n");
                break;
            }
        }
    }
    tek = stk;
    while  (tek!=NULL)
    {
        printf("%c",(*tek).value);
        tek = (*tek).next;
    }
    if(flag!=0)
        printf("Верно\n");
    else
        printf("Неверно символ\n");
}

Решение задачи: «Пример Дана строка символов. Проверьте правильность расстановки в ней круглых скобок»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
  char c;
  int  ptrS=0;
  int  S[200];
  char *Stri="(a b [c d] {{e {f}}} x)";
  int  err=0,i,j,l=strlen(Stri);
  for (i=0; i<200; i++) S[i]=0;     
  for (i=0; i<l; i++)
  {
      c=Stri[i];
      for (j=0; j<ptrS; j++) printf("%d ",S[j]); printf("\n");
      switch (c)
      {
         case '(' :  
              S[ptrS++]=1;
              break;
         case '[' :      
              S[ptrS++]=2;
              break;
         case '{' :      
              S[ptrS++]=3;
              break;
         case ')' : 
              if (ptrS==0) { err=1; break;} 
              if (S[--ptrS] != 1) { err=11; break;}
              break;
         case ']' : 
              if (ptrS==0) { err=2; break;} 
              if (S[--ptrS] != 2) { err=22; break;}
              break;
         case '}' : 
              if (ptrS==0) { err=3; break;} 
              if (S[--ptrS] != 3) { err=33; break;}
              break;
      }           
      if (err != 0) break;
  }            
              
  if ((err != 0) || (ptrS != 0)) 
     printf("Bad structure!\n");
  else
     printf("OK!\n");    
  
  system("PAUSE");  
  return 0;
}

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

  1. Программа проверяет правильность расстановки круглых скобок в строке символов.
  2. Вводная строка символов: (a b [c d] {{e {f}}} x).
  3. Переменные:
    • c - символ, который обрабатывается в текущий момент;
    • ptrS - указатель на текущий уровень вложенности;
    • S - массив для хранения информации о каждом уровне вложенности;
    • Stri - строка символов, которую необходимо проверить;
    • err - флаг ошибки;
    • i, j, l - индексы для работы со строкой Stri.
  4. Массив S инициализируется нулями.
  5. Внешний цикл обрабатывает каждый символ строки Stri.
  6. Внутренний цикл обрабатывает предварительный вывод текущего уровня вложенности.
  7. Используется оператор switch для определения типа текущего символа:
    • '(' - увеличивается уровень вложенности;
    • '[' - увеличивается уровень вложенности;
    • '{' - увеличивается уровень вложенности;
    • ')' - уменьшается уровень вложенности и проверяется правильность;
    • ']' - уменьшается уровень вложенности и проверяется правильность;
    • '}' - уменьшается уровень вложенности и проверяется правильность.
  8. Если err не равно 0 или ptrS не равно 0, программа выводит сообщение об ошибке.
  9. В противном случае выводится сообщение об успешной проверке.
  10. Программа ожидает нажатия любой клавиши перед завершением работы.
  11. Возвращается 0, что означает успешное завершение работы программы.

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

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