Как найти правильную последовательность скобок? - PullRequest
0 голосов
/ 06 января 2020

Я должен понять, что последовательность скобок правильная. Здесь моя проблема. Аккуратная скобка

& Вот мой код решения.

#include <stdio.h>
int main()
{
    char s[100];
    int c=0,count1=0,count2=0,count3=0;
    scanf("%[^\n]",s);
    while(s[c] !='\0')
        {
        if(s[c] == '(')
        {
            ++count1;
        }
        if(s[c] == ')')
        {
            ++count2;
        }
        if(s[c] == '"')
        {
            ++count3;
        }
        ++c;
    }
    if(count1==count2 && count3%2 ==0)
    {
        printf("Yes");
    }
    else
    {
        printf("No");
    }
    return 0;
}

Но он возвращает неправильный ответ для теста. & Я также знаю, что алгоритм неправильный, потому что он не может дать правильный ответ для этого теста

))) "" (((

Так как я могу улучшить свой алгоритм ???

Ответы [ 2 ]

1 голос
/ 06 января 2020

Сделайте это с std :: stack . Идея состоит в том, чтобы

  1. Если стек пуст, pu sh s[i] в стек.
  2. Сравнить текущий символ aka s[i] с stack.top() и всплывающий стек, если он совпадает .
  3. Pu sh текущий символ, также известный как s[i], в стек, когда совпадений не найдено.

Предположим, что ввод: "() (())". Теперь

A. i = 0. Первоначально стек пуст. Pu sh "(" в стеке. Стек - "(".

B. I = 1. Стек не пуст. Сравнить ")" aka s 1 с вершиной стека - "(". Это совпадает. Теперь поп-стек. Стек - "".

C. I = 2. Теперь стек пуст. Pu sh "(" в стеке. Стек - " (".

D. I = 3. Стек не пустой. Сравнить" ("aka s [3] с вершиной стека -") ". Не соответствует. Теперь pu sh" ( "to stack. Stack -" (("

E. i = 4. Стек не пустой. Сравните") "aka s [4] с верхом стека -" (". Это соответствует. Теперь, стек pop.. Stack - "("

F. i = 5. Стек не пустой. Сравните ")" aka s [5] с верхом стека - "(". Это соответствует. Теперь, pop pop . Stack - ""

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

     //Assuming s is the char array containing parenthesis sequence.
     int i = 0;
     std::stack<char> st;
     while(s[i] != '\0') //Better choice would be to use std::string
     {
        if(st.empty() )
        {
             st.push( s[i++] ); 
             continue;
        } 
        if( st.top() == '(' && s[i] == ')' )
            { st.pop(); i++ }
        else
            st.push(s[i++]);   

      }
       if(st.empty() )  
          printf("Yes");
       else 
          printf("No");
0 голосов
/ 10 января 2020

Хорошо. Я сделал. Вот мое решение. Благодаря "max66". Таким образом, в этой задаче вы должны определить одну самую важную вещь, которая ")" не используется без закрывающих тегов. Это я сделал. Вот мое решение.

#include <stdio.h>
int main()
{
    int c=0,count1=0,count2=0;
    char s[1000];
    scanf("%[^\n]",s);
    while(s[c] != '\0')
    {
        if(s[c] == '"')
        {
            ++count2;
        }
        if(s[c] == ')')
        {
            --count1;
        }
        if (count1 != -1)
        {
            if(s[c]== '(')
            {
               ++count1;
            }
        }

        ++c;
    }
    ///printf("%d\n",count1);
    ///printf("%d\n",count2);
    if(count1 == 0 && count2%2 == 0)
    {
        printf("Every thing is OK!\n");
    }
    else
    {
        printf("Something is fishy!\n");
    }
    return 0;
}
...