【问题标题】:Why I cant check whats on my stack?为什么我无法检查堆栈上的内容?
【发布时间】:2013-10-18 17:48:46
【问题描述】:

我正在编写一个简单的括号检查器。应该很容易。当它全部在一个功能中时,我让它工作,但我还需要为标准输入做一些事情。所以我认为最好做2个功能。话虽如此,我在第 82 行检查堆栈是否为空时遇到错误。无论出于何种原因,它都不允许我检查堆栈的顶部是否为空。我尝试在测试程序中查看它是否是某种引用错误,或者是否通过进入其他方法超出范围。它不是。应该可以正常工作,因为它是一个全局变量。

对我做错了什么的想法?我所有的互联网和知识都指向我做正确的想法。

以下是所有代码。它是可编译的。如果我需要澄清任何事情,我会非常乐意。

谢谢

#include <iostream>
#include <sstream>
#include <stack>
#include <deque>
#include <fstream>
#include <cstdlib>
using namespace std;

stack<char> BracketsCheck;
int linecounter = 0;
int FileNumber = 1;
int pos;
string str ="";
string filename;

int validate(string string)
{
        int size = str.size();
        for (int i = 0; i < str.size(); i++)
        {
            pos = i;
            if ((str[i] == '(' ) || (str[i] == '[') || (str[i] == '{'))
            {
                BracketsCheck.push(str[i]);
            }
            else if (str[i] == ')')
            {
                if (BracketsCheck.top() == '(')
                    BracketsCheck.pop();
                else
                {
                    cout << filename << ":" << linecounter << ":" << pos << "ERROR: missing open parenthesis" << endl;
                    return EXIT_FAILURE;
                }
            }
            else if (str[i] == ']')
            {
                if (BracketsCheck.top() == '[')
                    BracketsCheck.pop();
                else
                {
                    cout << filename << ":" << linecounter << ":" << pos << "ERROR: missing open squre bracket" << endl;
                    return EXIT_FAILURE;
                }
            }
            else if (str[i] == '}')
            {
                if (BracketsCheck.top() == '{')
                    BracketsCheck.pop();
                else
                {
                    cout << filename << ":" << linecounter << ":" << pos << "ERROR: missing open curly brace" << endl;
                    return EXIT_FAILURE;
                }
            }
        }
}

int main(int argc, char* argv[])
{
//  BracketsCheck.top() = 'h';

    if (argc == 1)
    {
        cin >> str;
        cout << "no arguments" << endl;
        validate (str);
        return 0;
    }
    else
    {
        while (argv[FileNumber] != NULL)
        {
            filename = argv[FileNumber];
            ifstream inFile(argv[FileNumber]);
            cout << argv[FileNumber]<<endl;
            while (getline(inFile, str))
            {
                validate(str);
                linecounter++;
            }
            if (BracketsCheck.top() !=  NULL)
            {
                cout << "got to null checker" << endl;
                cout << filename << ":" << linecounter << ":" << pos << "umatched closing brace" << endl;
                return EXIT_FAILURE;
            }
            FileNumber++;
        }
        return 0;
    }
}

【问题讨论】:

  • 是的,string string 只是我写的时候做的一个临时变量,一定要回去改。但我会尝试 empty() 看看它是否有效
  • 无论出于何种原因,它都有效。不知道为什么!BracketsCheck.empty() 的工作方式与BracketsCheck.top() != NULL 有任何不同,但确实如此。知道为什么吗?此外,如果您将评论表述为答案,则将您标记为正确答案。谢谢!

标签: c++ stack brackets


【解决方案1】:

根据您对我的 cmets 的回复。如果您要检查堆栈是否不为空,您还应该使用!BracketsCheck.empty()

int validate(string string)

可能不是一个好主意,因为您将隐藏 string 类型。

top() 将返回 referenceconst 引用 而不是指针,如果您的堆栈为空,则不应调用 top

我也劝你不要使用:

using namespace std;

它被认为是bad practice 我意识到一直输入std:: 一开始可能会很烦人,但一段时间后你真的会习惯它。

最后validate 需要一个return 语句,因为它应该返回int 并且在这种情况下没有返回的情况下从函数末尾流出将调用6.6.3 的未定义行为return 语句 C++ 标准草案中的第 2 段。

【讨论】:

    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多