#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(); //判断是否栈空,如果栈为空则说明匹配完毕,如果未空则说明有括号未匹配
}