gpt4 book ai didi

c++ - 为什么我无法检查堆栈中的内容?

转载 作者:行者123 更新时间:2023-11-30 02:51:49 26 4
gpt4 key购买 nike

我正在编写一个简单的括号检查器。应该很容易。当它全部在一个函数中时我让它工作,但我还需要为标准输入做一些事情。所以我认为最好做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;
}
}

最佳答案

基于您对我的评论的回复。如果您尝试检查堆栈是否为空,您还应该使用 !BracketsCheck.empty():

int validate(string string)

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

top()将返回一个 referenceconst reference 而不是一个指针,如果你的栈是空的你不应该调用 top

我也不鼓励你使用:

using namespace std;

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

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

关于c++ - 为什么我无法检查堆栈中的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19456004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com