#include <iostream> #include "Stack.h" using std::string; using std::cout; using std::endl; /** * 检测字符串中的括号是否匹配 * @param str 待检测匹配的字符串 * @param tps1 匹配的符号 * @param tps2 与tps1相匹配且顺序一致的符号 * @return 括号是否匹配的布尔值 */ bool isPaired(string str, string tps1, string tps2); int main() { string s = "int main(){func(){while(true){cout << endl}}}"; //待检测字符串 string msg; msg = isPaired(s, "({[", ")}]") ? "OK" : "No"; cout << msg << endl; return 0; } bool isPaired(string str, string tps1, string tps2) { Stack<char> stack(str.length() / 2); //如果字符串中的括号匹配,最差情况下栈需要的长度等于字符串长度的一半 int tps_pos; char tmp; for (char i : str) { if (tps1.find(i) != -1) { //栈存储字符串中的左括号 if (stack.isFull()) return false; stack.push(i); } else if ((tps_pos = tps2.find(i)) != -1) { if (stack.isEmpty()) return false; stack.pop(tmp); if (tps1[tps_pos] != tmp) { //判断字符串的某一右括号字符对应匹配的左括号是否与当前pop出的元素是否一致 return false; } } } return stack.isEmpty(); //判断是否栈空,如果栈为空则说明匹配完毕,如果未空则说明有括号未匹配 }
好吧,这不是一个提问。只是一个代码片段分享,评论区不支持语法高亮就发问答区了。
我也来分享一下,兄弟不会介意吧。和你写的有点不同,也支持干扰字符! MyStack<char> *pStack = new MyStack<char>(30); int flag = 0; char elem; char str[] = "[cfg(2sdf*2ds)f]"; for (int i = 0;i < strlen(str);i++) { switch (str[i]) { case '(': case '[': pStack->push(str[i]); break; case ')': if (!pStack->pop(elem)) { flag = 1; continue; } if (elem != '(') { flag = 1; } break; case ']': if (!pStack->pop(elem)) { flag = 1; continue; } if (elem != '[') { flag = 1; } break; } } if (!pStack->stackEmpty() || 1 == flag) { cout << "字符串括号不匹配" << endl; } else { cout << "字符串括号匹配" << endl; }
#include <iostream>
#include "Stack.h"
using std::string;
using std::cout;
using std::endl;
/**
* 检测字符串中的括号是否匹配
* @param str 待检测匹配的字符串
* @param tps1 匹配的符号
* @param tps2 与tps1相匹配且顺序一致的符号
* @return 括号是否匹配的布尔值
*/
bool isPaired(string str, string tps1, string tps2);
int main() {
string s = "int main(){func(){while(true){cout << endl}}}"; //待检测字符串
string msg;
msg = isPaired(s, "({[", ")}]") ? "OK" : "No";
cout << msg << endl;
return 0;
}
bool isPaired(string str, string tps1, string tps2) {
Stack<char> stack(str.length() / 2); //如果字符串中的括号匹配,最差情况下栈需要的长度等于字符串长度的一半
int tps_pos;
char tmp;
for (char i : str) {
if (tps1.find(i) != -1) { //栈存储字符串中的左括号
if (stack.isFull())
return false;
stack.push(i);
} else if ((tps_pos = tps2.find(i)) != -1) {
if (stack.isEmpty())
return false;
stack.pop(tmp);
if (tps1[tps_pos] != tmp) { //判断字符串的某一右括号字符对应匹配的左括号是否与当前pop出的元素是否一致
return false;
}
}
}
return stack.isEmpty(); //判断是否栈空,如果栈为空则说明匹配完毕,如果未空则说明有括号未匹配
}