如何在控制台应用程序中匹配支撑以进行C++

How to match brace in console applications for C++

本文关键字:C++ 控制台 应用程序      更新时间:2023-10-16

我正在制作一个 c++ 控制台应用程序,我的问题是与容纳第一对牙套的堆栈相比,我无法让我的大括号匹配并等于 true。插入此算法的方法具有矢量标记参数 我已经编写并重写了几次代码。在下面的帖子中,我放置了一段非常简单的代码来展示我正在尝试做的事情的一些想法:

堆叠熟食店;

for (size_t i=0; i<ie.size(); i++) {        
    if(ie[i].value =="{"|| ie[i].value =="(" || ie[i].value =="[")  
     {deli.push(ie[i].value);
        if(deli.top() != "}" || deli.top() != ")" || deli.top() != "]"){
        return false;
           deli.pop(); 
        }
          if(deli.top() == "}" || deli.top() != ")" || deli.top() != "]"){
              return true;
        }
    }

}//end of for loop

我认为这是为了作业?

以下是一些提示:

  • 通过使用类似 if/else if 语句的内容,将获得左括号的情况与获得右括号的情况分开

  • 当你得到一个开放的括号时,你想把它推到堆栈上,应该是这样

  • 当您获得右括号时,您希望验证堆栈的顶部以查看是否存在相同类型的关联左括号(如果这与你相关),并通过弹出堆栈来删除该左括号。

  • 循环完成后,堆栈应为空,否则出现错误

您可能想要此结构:

for (size_t i=0; i<ie.size(); i++)
{
    if (/*conditions for open brackets*/) 
    {
        //Push the bracket on the stack
    }
    else if (/*conditions for closing brackets*/)
    {
        //Check the top of the stack if there is an opening bracket
        //If so, pop the stack. If not, error.
    }
}

代码的逻辑似乎存在一些问题。我不清楚你想做什么。无论如何,我将帮助确定代码中的一些遗漏点。

  • 你根据条件尝试做什么

if(deli.top() != "}" || deli.top() != ")" || deli.top() != "]"){在我看来有些不对劲。"不等于"与"或"

  • 你的代码永远不会到达下行。 因为函数在 beofre 行返回。

    deli.pop();

  • 在这种情况下,您尝试做什么

    if(deli.top() == "}" || deli.top() != ")" || deli.top() != "]"){

对我来说看起来有些不对劲 Equl 而不是 Equl 与 or

如果你用语言解释你需要做什么,其他人可以帮助你

您的代码肯定不起作用,因为您没有将一种类型的括号与另一种类型的括号匹配,而是将任何类型的括号与任何其他类型匹配。
解决方案之一是在找到大括号,方括号,括号时计算它们,当它们的计数匹配时。
其他解决方案是更通用的解决方案,与编译器构造有关。如果你已经学习过这个主题,你应该能够编写一个无竞赛的语法并将其转换为确定性有限自动机(DFA),然后编写程序来解析输入。它需要一些深入的研究,但真的很有帮助。