平衡括号 - 堆栈未被认为是空的
Balanced Brackets - stack not recognized as empty
这让我有些蝙蝠。我花了很长的时间试图找到错误,而无法。问题是确定给定的括号是否平衡。输入'{[()()]}'在应返回1时返回0。有什么想法吗?
#include <stack>
int solution(string &S) {
stack<char> bracketStack;
char a, b, c;
for (int i = 0; i < S.length(); i++) {
if (S[i]=='{' || S[i]=='[' || S[i]=='(') {
bracketStack.push(S[i]);
} else {
switch (S[i]) {
case ('}') :
a = bracketStack.top();
bracketStack.pop();
if (a==']' || a==')') {
return 0;
}
case (']') :
b = bracketStack.top();
bracketStack.pop();
if (b=='}' || b==')') {
return 0;
}
case (')') :
c = bracketStack.top();
bracketStack.pop();
if (c==']' || c=='}') {
return 0;
}
}
}
}
if (bracketStack.empty()) {
cout << "empty";
return 1;
} else {
return 0;
}
}
您的代码逻辑有一个错误:呼叫
a = bracketStack.top(); // or b, or c
在switch
的所有三个分支内部都没有受到堆栈非空的检查的保护。当关闭括号还要多于打开方括号时,这将导致不确定的行为(从堆栈的无效元素读取)。
解决此问题将解决您遇到的问题。但是,您的程序仍然不最佳,因为这三个分支看起来几乎相同。您可以通过将开关组合如下来解决此问题:
// Set up an array of matching brackets: } --> {, ] --> [, ) --> (
char match[128] = {0};
match['}'] = '{';
match[']'] = '[';
match[')'] = '(';
... // This goes inside the `for` loop
if (S[i]=='{' || S[i]=='[' || S[i]=='(') {
bracketStack.push(S[i]);
} else {
if (bracketStack.empty()) {
cout << "More closing brackets than opening ones" << endl;
return 0;
}
a = bracketStack.top();
bracketStack.pop();
if (match[a] != S[i]) {
cout << "Mismatched" << endl;
return false;
}
}
相关文章:
- 为什么rand()的使用被认为是不好的
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- 一个C头文件可以被认为是一个接口吗
- 如果我使用malloc()而不是堆栈数组,OpenGL不会渲染对象
- 为什么const char*和const char[]作为函数参数被认为是等价的
- 为什么12.0==11.999999999999999999被认为是真的
- 这会被认为是糟糕的编程实践吗?
- 为什么这被认为是恒定的?
- 抽象类/接口中的空方法是否被认为是一种好的做法?
- 如果我具有调用其其他实例之一的超载函数,它是否被认为是递归功能
- std::unique_ptr可以被认为是一个monad吗?
- 被调用方如何知道参数是通过寄存器而不是堆栈传递的
- C++ 指向类的指针和/或引用是否被认为是"movable"?
- 使用自定义宏来简化 cin 和 cout 语句等内容被认为是更好还是更差
- 使用成员函数更改对象或返回并分配它是否被认为是更好的做法?
- 我很难修复我认为是双重免费的东西
- 使用 #define 被认为是"bad practice"吗?
- 是一个被认为是不同类型的班级内部的正向声明
- 平衡括号 - 堆栈未被认为是空的