程序在特定场景下不输出所需的输出:堆栈和解析

Program not outputting desired output in specific scenario: stacks and parsing

本文关键字:输出 堆栈 和解 程序      更新时间:2023-10-16

所以这个程序的目标是读取一个代码的文本文件,并确保有一个均匀的平衡[], (), {},使用堆栈。

我必须读取的第一个.txt文件如下:

{}   }

读取后,程序应返回一个匹配{ }对和一个不平衡符号}(它成功了!

我必须阅读的第二个.txt文件如下:

{}

它应该返回余额,甚至配对匹配{ }(它成功地做到了!

第三个文本文件应如下所示:

{  {}

它应该返回一个匹配的对{ }(它这样做)和一个不平衡符号{(它没有)。它只返回对匹配{ }(这是真的),但它也应该打印出存在不平衡{。有人知道为什么它在此特定情况下不起作用吗?

编写完代码后,您需要检查文件是否已到达 eof 但堆栈不为空。如果堆栈不为空,则必须将堆栈的内容打印为不平衡。

在 while 循环之后,

  while(!STACK.empty()){
          char b = STACK.top();
          if(b == '(' || b == '{' || b== '['){
              cout << b << "is unbalanced" << endl;
             sameSymbol = false;
          }
          STACK.pop()
    }

要解决行号查询,请执行以下操作:

bool sameSymbol = true;
stack <char> STACK;
char a, b;
while (true)
    {
        if(!textfile.get(a)) {
            while(!STACK.empty()){
                char b = STACK.top();
                if(b == '(' || b == '{' || b== '['){
                    cout << b << "is unbalanced" << endl;
                   sameSymbol = false;
                }
               STACK.pop()
            }
            break;
        }

        // if a is a (, {, or [, push onto the stack
        if (a == '(' || a == '{' || a == '[')
        {
            STACK.push(a);
        }
        // if a is a ), }, or ]
        else if (a == ')' || a == '}' || a == ']')
        {
            //if the stack is empty, return false
            if (STACK.empty())
            {
                cout << "unbalanced symbol " << a << " at line " << endl;
                sameSymbol = false;             
                break;
            }
            b = STACK.top();
            STACK.pop();
            if (TestIfMatching(a, b))
            {
                cout << "pair matching " << b << " and " << a << endl;
                sameSymbol = true;
            }
            // if a and b are not matching parenthesis return false
            if (!TestIfMatching(a, b))
            {
                cout << "unbalanced " << a << " symbol at line " << endl;
                sameSymbol = false;
                break;
            }
        }
    }