C++STL库栈算法的括号匹配
2015-03-21 00:26
183 查看
很久没写了,原因是懒惰……另外大一在学校也难上网……不说了
昨天晚上看了C++的STL库,感觉C++功能非常的强大呢!
于是刚好想起了以前用C写了一个括号匹配,很复杂,具体思路是先把括号转换为int数组,然后开始向右找右括号。
现在用栈的算法写了一个相对简单很多的括号匹配!
先简单说一下栈
栈包括入栈(push())和出栈(pop())
(画图好麻烦……)
简单来说,栈就是一容器,想象一个箱子,每次只能刚好放入一件东西,当中的数据符合先入后出。
C++中有#include<stack>栈的类,具体可百度、Google
下面贴代码
for(auto c : s)
是C++11的新标准,遍历一次字符串s,c代表每一次循环数组的元素。
这里c是一个副本,对c的操作不会修改s
若要修改字符串内容,则写
for ( auto &c : s) 对c做一个引用。
算法其实很好理解
据说正则表达式会更简单,有机会以后再更新。
。。。end
昨天晚上看了C++的STL库,感觉C++功能非常的强大呢!
于是刚好想起了以前用C写了一个括号匹配,很复杂,具体思路是先把括号转换为int数组,然后开始向右找右括号。
现在用栈的算法写了一个相对简单很多的括号匹配!
先简单说一下栈
栈包括入栈(push())和出栈(pop())
(画图好麻烦……)
简单来说,栈就是一容器,想象一个箱子,每次只能刚好放入一件东西,当中的数据符合先入后出。
C++中有#include<stack>栈的类,具体可百度、Google
下面贴代码
#include<iostream> #include<cstdio> #include<string> #include<stack> using namespace std; int main() { string s; stack<char> ss; cin >> s; for (auto c : s) //C++11新标准,即遍历一次字符串s { if (c == '(' || c == '{' || c == '[') ss.push(c); if (c == '}' || c == ']') { if (!ss.empty()&&ss.top() == (c - 2)) ss.pop(); //ASCII码中[]和{}括号差二 else { printf("Wrong!\n"); return 0; } } if (c == ')') { if (!ss.empty()&&ss.top() == (c - 1)) ss.pop(); //ASCII码中()括号差一 else { printf("Wrong!\n"); return 0; } } } if (ss.empty()) printf("Right!\n"); else printf("Wrong!\n"); return 0; }
for(auto c : s)
是C++11的新标准,遍历一次字符串s,c代表每一次循环数组的元素。
这里c是一个副本,对c的操作不会修改s
若要修改字符串内容,则写
for ( auto &c : s) 对c做一个引用。
算法其实很好理解
据说正则表达式会更简单,有机会以后再更新。
。。。end