在之前我们介绍了如何使用C语言解决括号配对的问题,详情可以参考Codeup[100000605]Problem E-C版。
下面我们来看下如何使用C++标准库中的stack来解决相同的问题。
在stack头文件中提供了以下几个函数:
- empty,判断栈是否为空,栈为空时返回真
- top,获取栈顶元素
- pop,将栈顶弹出
下面是对应实现的代码:
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
int main() {
int n;
while (scanf("%d", &n) != EOF) {
char line[3000] = {0};
for (int i = 0; i < n; ++i) {
scanf("%s", line);
stack<char> Stack;
int length = strlen(line);
int need_continue = 1;
for (int j = 0; j < length; ++j) {
char s = line[j];
//入栈
if (s == '(' || s == '[' || s == '{') {
Stack.push(s);
} else if (s == ')' || s == ']' || s == '}') {
// 栈不为空则进行出栈并弹出
if (!Stack.empty()) {
char c = Stack.top();
Stack.pop();
if ((s-c)>2||(s-c)<1) {
need_continue = 0;
break;
}
} else {
//栈为空直接跳出
need_continue = 0;
break;
}
}
}
if (need_continue == 1 && Stack.empty()) {
printf("yes\n");
} else {
printf("no\n");
}
}
}
return 0;
}
我们在stack中储存的是char类型的数据,当读取到的元素为{,(及[时进行压栈操作。而当读取到},),]时进行出栈操作。在出栈之前,需要查看当前栈是否为空,如果为空是不允许出栈的,因为此时栈中根本就没有元素。
如果栈不为空则弹出栈顶元素,查看2个元素大小的差值是否小于2,因为{和}的值相差为2,而(与)之间相差1,其他情况说明括号明显不匹配。
由于括号是匹配的,如果发现此时栈为空的,说明之前根本没有压入相应的括号,此时就可以直接跳出了,后续读取操作不再进行。
最后是通过后的结果:

本文介绍如何利用C++标准库中的stack解决括号匹配问题。通过压栈与出栈操作,判断输入字符串中的括号是否正确配对。
1172

被折叠的 条评论
为什么被折叠?



