如何找到正确的括号顺序?
How to find the correct brackets sequence?
我必须弄清楚括号顺序是否正确。这是我的问题。
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] !='[=10=]')
{
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;
}
但它 returns 测试用例的错误答案。 &我也知道该算法不正确,因为它无法给出此测试用例的正确答案
)))""(((
那么我该如何改进我的算法???
用 std::stack 做。想法是
- 如果堆栈为空,将
s[i]
压入堆栈。
- 将当前字符
s[i]
与 stack.top()
进行比较,如果匹配则弹出堆栈。
- 当没有找到匹配项时,将当前字符又名
s[i]
压入堆栈。
假设输入是:“()(())”。现在,
一个。 i = 0。最初堆栈是空的。将 "(" 压入堆栈。堆栈 - "(".
乙。 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] != '[=10=]') //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");
好的。我弄完了。这是我的解决方案。感谢“ max66 ”。
所以在这个问题中,你必须确定一个最重要的事情,即没有结束标签就不能使用“)”。我已经做到了。
这是我的解决方案。
#include <stdio.h>
int main()
{
int c=0,count1=0,count2=0;
char s[1000];
scanf("%[^\n]",s);
while(s[c] != '[=10=]')
{
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;
}
我必须弄清楚括号顺序是否正确。这是我的问题。 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] !='[=10=]')
{
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;
}
但它 returns 测试用例的错误答案。 &我也知道该算法不正确,因为它无法给出此测试用例的正确答案
)))""(((
那么我该如何改进我的算法???
用 std::stack 做。想法是
- 如果堆栈为空,将
s[i]
压入堆栈。 - 将当前字符
s[i]
与stack.top()
进行比较,如果匹配则弹出堆栈。 - 当没有找到匹配项时,将当前字符又名
s[i]
压入堆栈。
假设输入是:“()(())”。现在,
一个。 i = 0。最初堆栈是空的。将 "(" 压入堆栈。堆栈 - "(".
乙。 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] != '[=10=]') //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");
好的。我弄完了。这是我的解决方案。感谢“ max66 ”。 所以在这个问题中,你必须确定一个最重要的事情,即没有结束标签就不能使用“)”。我已经做到了。 这是我的解决方案。
#include <stdio.h>
int main()
{
int c=0,count1=0,count2=0;
char s[1000];
scanf("%[^\n]",s);
while(s[c] != '[=10=]')
{
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;
}