【问题标题】:How to find the correct brackets sequence?如何找到正确的括号顺序?
【发布时间】:2020-01-06 16:39:44
【问题描述】:

我必须弄清楚括号顺序是正确的。这是我的问题。 Neat bracket

& 这是我的解决方案代码。

#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;
}

但它为测试用例返回不正确的答案。 & 我也知道该算法不正确,因为它无法为这个测试用例给出正确的答案

)))""(((

那么我该如何改进我的算法???

【问题讨论】:

  • 提示:您听说过数据结构“堆栈”吗?它有称为 push 和 pop 的操作。
  • 不需要堆栈来解决这个问题。提示:对于计数相等的字符串(()))(,每一步的count1count2 是什么?第一次在初始子字符串(())) 上发生了一些事情,这暗示了一个问题......
  • 部分建议:括号的单个计数器;当“(”时增加它;递减它并且检查“)”不小于零;最后检查它是否为零。不知道如何与" 混合。
  • 我强烈建议你学习堆栈。如果你知道数组或向量,你会没事的。这个问题最好用它来解决(可能还有其他更好的方法,但这是我解决它的方法)
  • 你为什么要匹配 " 字符?

标签: c algorithm c++17 sequence


【解决方案1】:

请使用std::stack。想法是

  1. 如果堆栈为空,则将s[i] 推入堆栈。
  2. 比较当前字符 aka s[i]stack.top(),如果匹配则弹出堆栈。
  3. 未找到匹配项时,将当前字符(即 s[i])推入堆栈。

假设输入是:“()(())”。现在,

A. i = 0。最初堆栈为空。将“(”压入堆栈。堆栈 - “(”。

B. i = 1。堆栈不为空。比较 ")" aka s1 与堆栈的顶部 - "("。它确实匹配。现在,弹出堆栈。堆栈 - ""。

C. i = 2。现在堆栈为空。将“(”压入堆栈。堆栈 - “(”。

D. i = 3。堆栈不为空。将“(”又名 s[3] 与堆栈顶部 - “)”进行比较。它不匹配。现在,将 "(" 推入堆栈。堆栈 - "(("

E. i = 4。堆栈不为空。将 ")" aka s[4] 与堆栈的顶部 - "(" 进行比较。它确实匹配。现在,弹出堆栈。堆栈 - "("

F。 i = 5。堆栈不为空。比较 ")" aka s[5] 和堆栈的顶部 - "("。它确实匹配。现在,弹出堆栈。堆栈 - ""

现在,堆栈是空的,我们可以说字符串是整洁的 - 正如问题中提到的那样。如果我们在堆栈中留下任何不匹配的括号,那意味着字符串不整齐。

     //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");

【讨论】:

    【解决方案2】:

    好的。我弄完了。这是我的解决方案。感谢“ 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;
    }
    

    【讨论】:

    • 很高兴听到您找到了问题的原因。您可以通过解释如何诊断它,特别是在其他地方看到该问题时,哪些证据可以识别此问题,从而使您的答案对未来的读者更有帮助。
    • 好的,我试试(我的英语很差,希望大家能理解)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2011-01-31
    • 2019-04-14
    • 1970-01-01
    相关资源
    最近更新 更多