为了账号安全,请及时绑定邮箱和手机立即绑定

自己写的一个单栈括号匹配,支持干扰字符

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

好吧,这不是一个提问。只是一个代码片段分享,评论区不支持语法高亮就发问答区了。

正在回答

2 回答

我也来分享一下,兄弟不会介意吧。和你写的有点不同,也支持干扰字符!

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;
 }


1 回复 有任何疑惑可以回复我~

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

}


1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
数据结构探险—栈篇
  • 参与学习       62655    人
  • 解答问题       102    个

栈,先入后出(FILO),带领大家体会栈这种数据结构的美妙

进入课程

自己写的一个单栈括号匹配,支持干扰字符

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信