根据一些规则检查字符串表达式的有效性

时间:2017-03-02 11:19:57

标签: c++ string algorithm

我有这个棘手的问题,我无法解决:

我们有一个包含“{}”或“[]”序列的字符串,我想编写一个检查字符串是否有效的函数或方法:它应该返回true:

  • 如果字符串为空
  • 如果E有效(仅包含上述序列),则{E}或[E]也有效。
  • 或者如果E和F是有效表达式的连接,结果也是有效的。

    "[{}]" // valid
    "{[}]" // invalid
    "{{[[]]}}" // valid
    "{{[[]]}}{{[[]]}}" // valid
    

我尝试通过char扫描字符串char来解决这个问题,我没有找到合适的算法然后我想到了regex_match,最后我告诉自己这种问题应该用状态机来解决(像EBNF)。

你能做些什么来解决这个问题?

1 个答案:

答案 0 :(得分:0)

C ++中的简单答案

   static bool check(const string& sequence)
   {
      if (sequence.empty())
         return true;

      std::stack<char> stack;

      for (size_t i = 0; i < sequence.length(); ++i)
      {
         const char current = sequence.at(i);
         if (current == '{' || current == '[')
            stack.push(current);

         if (current == '}' || current == ']')
         {
            if (stack.empty())
               return false;

            char last = stack.top();
            if (current == '}' && last == '{' || current == ']' && last == '[')
               stack.pop();
            else
               return false;
         }
      }

      return stack.empty();
   }