c++的实现问题
老师我想用c++实现这个问题,但是遇到了一些问题:
如果是"[ ( [ ] [ ] ) ]"这样的例子就无法通过,我debug发现在入栈过程中只有"["成功,紧接着就退出循环,直接进行判断。但是如果我用map来对应判断,例子就顺利通过测试。
1.成功的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include<stdio.h> #include<map> #include<iostream> #include<stack> using namespace std; int main() { string s; getline(cin,s); int len=s.size(); map< char , char > m; m[ '(' ]= ')' ; m[ '{' ]= '}' ; m[ '[' ]= ']' ; stack < char > a; int flag=1; for ( int i=0;i<len;i++) { if (s[i]== '(' || s[i]== '{' || s[i]== '[' ) a.push(s[i]); else if (s[i]== ')' || s[i]== '}' || s[i]== ']' ) { if (a.size() && m[a.top()]==s[i]) a.pop(); else { flag=0; break ; } } } if (flag && a.size() == 0) printf ( "yes\n" ); else printf ( "no\n" ); return 0; |
2.失败的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <iostream> #include <stack> #include <string> using namespace std; int main( void ){ stack< char > s; string str; cin >> str; //push and pop int flag = 1; for ( int i = 0;i < str.length(); i++){ //push if (str[i] == '(' || str[i] == '[' || str[i] == '{' ){ s.push(str[i]); } else if (str[i] == ')' || str[i] == ']' || str[i] == '}' ){ //pop if (s.empty() || ((s.top() == '(' && str[i] != ')' ) || (s.top() == '[' && str[i] != ']' ) || (s.top() == '{' && str[i] != '}' ))){ flag = 0; break ; } s.pop(); } } if (flag == 1 && s.empty()){ cout << "yes\n" ; } else { cout << "no\n" ; } return 0; } |
45
收起
正在回答 回答被采纳积分+1
2回答
我是没有昵称
2021-03-29 21:39:00
1 | // 你参考一下我的代码,然后debug一下你的代码,我估计是pop的时机不对<br>// 循环时碰到非各种括号的字符,直接跳过即可<br>#include <iostream><br>#include <string><br>#include <stack><br><br>using namespace std;<br><br>class Solution<br>{<br>public:<br> static bool isValid(string s)<br> {<br> stack<char> myStack;<br> for (int i = 0; i < s.length(); i++)<br> {<br> char c = s[i];<br> if (c == '(' || c == '[' || c == '{')<br> myStack.push(c);<br> else if (c == ')' || c == ']' || c == '}')<br> {<br> if (myStack.empty())<br> return false;<br> char topChar = myStack.top();<br> myStack.pop();<br> if (c == ')' && topChar != '(')<br> return false;<br> if (c == ']' && topChar != '[')<br> return false;<br> if (c == '}' && topChar != '{')<br> return false;<br> }<br> }<br> return myStack.empty();<br> }<br>};<br><br>int main()<br>{<br> string s1 = "{ $$ ( [ ] ) } ";<br> string s2 = "{$( [] } )";<br> cout << Solution::isValid(s1) << endl;<br> cout << Solution::isValid(s2) << endl;<br>}<br> |
liuyubobobo
2020-10-06 13:03:41
你再问题描述中的那个括号字符串中有大量的空格,所以导致了返回 No
我测试你的程序使用这个输入是没有问题的:
1 | [([][])] |
继续加油!:)
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧