хорошо сбалансированное и правильно написанное выражение

#c #algorithm #stack

#c #алгоритм #стек

Вопрос:

у меня есть строка (char * ch) со скобками, и я должен:

1) проверьте, правильно ли написана строка и хорошо ли сбалансирована, например: «(())» правильно написано и хорошо сбалансировано, в то время как «)()» не является ни хорошо написанным, ни хорошо сбалансированным

2) верните позицию первой круглой скобки, которая отклоняется от этого правила, если строка неправильно написана и не сбалансирована.

что касается первого вопроса, то все в порядке. мой код выглядит следующим образом:

 int WBalanced(char *ch)
{
    stack p; int i;

 for (i=0; i<strlen(ch);i  ) 
  {

    if(ch[i] == '(')
    {
        addStack(P, ch[i]);
    else if(ch[i] == ')') 
      {
        if(stackEmpty(P) == 0) 
            unstack(P);
        else
            return (0);
       }
     }
   }



 if(stackEmpty(P)==1) 
    return (0);
 else
    return (1);

} 
  

но что касается второго вопроса, я не очень хорошо понимаю вопрос. если моя строка «(()», соответствует ли позиция позиции второй круглой скобки? и если моя строка «(()(» какова позиция отклоненной круглой скобки?

спасибо за помощь

Комментарии:

1. Для "(()(" это тот же ответ, что и вопрос, касается нахождения положения первой круглой скобки, которое отклоняется от правила.

2. @ChetanRanpariya какова позиция отклоненной круглой скобки, пожалуйста, если моя строка «(()(» спасибо

3. Если у вас есть сомнения относительно смысла задания, вам следует спросить своего профессора или TA. Мы тоже не знаем, что они означают.

4. Позиция первой отклоняющейся круглой скобки равна 1 для "(()("

5. @ChetanRanpariya я думаю, что это 4, последняя скобка!

Ответ №1:

Несомненно, есть много способов подойти к этому, но из-за отсутствия дополнительных требований я бы считал уровни вложенности, просматривая слева направо. Если количество становится меньше нуля, укажите на этот символ в качестве причины.

Если строка заканчивается, а уровень не равен нулю, укажите на это место (вероятно) как на неполное выражение.

Комментарии:

1. Допустим, строка «((asd)asd». Нарушающим ( является второй символ. Как он узнает об этом, если сделает то, что вы предлагаете?

2. @DavidSchwartz: Я бы сказал, что в этом случае нарушающим ( является первый символ, поскольку именно он не соответствует. Второму символу соответствует 6-й…

3. @DavidSchwartz да, для «((asd) asd» это вторая скобка, но как это реализовать?

4. В конце, если счетчик отличен от нуля, верните (индекс) первую круглую скобку в строке, поскольку это первая скобка, которая является несбалансированной (после этого может быть больше несбалансированных, но первая скобка является несбалансированной.

5. @ChrisDodd какой счет, пожалуйста? «если счетчик отличен от нуля»

Ответ №2:

Используя Stack в качестве реализации для проверки баланса скобок, решение должно быть :

Во-первых, предположим, что индексация начинается с 0. Stack.top = -1 (указывает, что в стек не вставлена скобка). Мы запускаем наш алгоритм от 1-й левой круглой скобки (индекс 0) до конечной круглой скобки. fault_index = -1 (используется для вывода, какая скобка ошибочна)

  1. Если встречается ‘(‘ -> вставить в стек. Stack.top = 1 и fault_index = индекс этой круглой скобки в данной строке (fault_index должен быть установлен только тогда, когда стек пуст, прежде чем вставлять эту круглую скобку)

  2. Если встречается ‘)’ -> удалить ‘(‘ из стека. Stack.top -= 1.

Мы останавливаемся при возникновении любого из этих условий и должны предпринять соответствующие действия :

  1. Когда строка пуста :

    a. Если стек пуст -> Были сбалансированы строковые скобки.

    b. Если стек не пуст -> Ошибка находится в fault_index

  2. Когда вы сталкиваетесь с дополнительным ‘)’, т. е. когда стек пуст и в нем есть эта скобка, этот индекс является fault_index .

Комментарии:

1. @Constellation, Для вашего заданного ввода «(()» вот как будет выполняться код: Изначально столкнулись Stack.top = -1 и fault_index = -1 ( -> Stack.top = 0 и поскольку стек был пуст, fault_index = 0 (индекс символа в строке. ) . Push ( для стека другого ( -> Stack.top = 1 , fault_Index не обновляется, поскольку стек не пустой. Переместить в стек. Обнаружено) -> Stack.top уменьшено с 1 до 0. fault_index по-прежнему равен 0 . Поскольку строка пуста -> а стек не пуст. Ошибка при fault_index = 0 .

Ответ №3:

спасибо за ваши ответы. использование counter — неплохая идея, но она может быть функциональной в этом случае «(()» и не функциональной в этом случае «((()(«… 🙁