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

时间:2016-03-12 01:48:43

标签: c++ stack

因此,该程序的目标是读取代码的文本文件,并使用堆栈确保[], (), {}均衡。

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

{}   }

一旦阅读,程序应返回一对匹配{ }和一个不平衡符号}(它成功完成!)

我必须阅读的second.txt文件如下:

{}

它应该返回一个余额,甚至是匹配{ }的对(它成功完成!)

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

{  {}

它应该返回匹配的对{ }(它做)和不平衡符号{(它没有' )。它只返回匹配{ }的对(这是真的),但它也应该打印出不平衡{。任何人都知道为什么它不能在这个特定情况下工作?

1 个答案:

答案 0 :(得分:0)

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

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