如何使用堆栈C++以相反的顺序读取文件和打印
how to read file and print in reverse order using stack C++
我必须一次读取文本文件中的每个单词,然后将该单词压入堆栈,然后一次弹出每个单词以在显示器上打印。我尝试了以下代码,但在 运行 程序之后,编译器只显示空白屏幕,没有错误。
笔记:
我不允许使用 class 或结构或使用 STL 来实现堆栈。必须使用固定大小的单词数组和用于指示堆栈顶部的索引整数来实现堆栈
我的文本文件是这样的:
one two three four five
six seven and so on
输出应该是:
no os dna neves xis ...
main.cpp
using namespace std;
char word;
void push(char);
void pop();
void displaywords();
int count = 0;
const int arr_Size=50;
string stack[arr_Size];
int main()
{
//string word;
ifstream infile;
infile.open("data.txt");
if(!infile)
{
cerr << "An error occurred while opening the file.";
exit(1);
}
do
{
cin >> word;
if (infile.fail())
break;
cout << word;
push(word);
}while(infile.eof());
infile.close();
while(stack!=NULL) // trying to write code for stack is not null
{
displaywords();
pop();
}
return 0;
}
void push(char word)
{
count = count + 1;
stack[count] = word;
}
void displaywords()
{
cout << "PUSHED " << " " << stack[count] << " ." << endl;
}
void pop()
{
count = count - 1;
}
那是因为您正在尝试读取 cin
。将 do
块中的 cin
更改为 infile
.
你的代码有不少问题。一个明显的原因是读取循环的条件是 while(infile.eof())
。这几乎肯定不是你想要的。 while(!infile.eof())
可能是您所想的,但这也行不通 correctly/dependably。
您也在打开 infile
,但是当您阅读时,您尝试从 cin
而不是 infile
阅读。
您还尝试使用 while(stack!=NULL)
,明显的目的是读取直到堆栈为空——但 stack
是一个数组。它永远不会比较等于 NULL。
由于您使用的是 C++,因此我会使用标准容器(例如 std::vector
或 std::deque
,有或没有 std::stack
适配器)。这个一般顺序上的东西应该更接近一点:
std::vector<std::string> strings;
std::infile("some file.txt");
std::string word;
while (infile >> word)
strings.push_back(word);
while (!strings.empty()) {
std::cout << strings.back();
strings.pop_back();
}
std::cin 从标准输入读取。您不会从流缓冲区中获取任何内容 - 它正在等待用户输入。
我必须一次读取文本文件中的每个单词,然后将该单词压入堆栈,然后一次弹出每个单词以在显示器上打印。我尝试了以下代码,但在 运行 程序之后,编译器只显示空白屏幕,没有错误。 笔记: 我不允许使用 class 或结构或使用 STL 来实现堆栈。必须使用固定大小的单词数组和用于指示堆栈顶部的索引整数来实现堆栈
我的文本文件是这样的:
one two three four five
six seven and so on
输出应该是:
no os dna neves xis ...
main.cpp
using namespace std;
char word;
void push(char);
void pop();
void displaywords();
int count = 0;
const int arr_Size=50;
string stack[arr_Size];
int main()
{
//string word;
ifstream infile;
infile.open("data.txt");
if(!infile)
{
cerr << "An error occurred while opening the file.";
exit(1);
}
do
{
cin >> word;
if (infile.fail())
break;
cout << word;
push(word);
}while(infile.eof());
infile.close();
while(stack!=NULL) // trying to write code for stack is not null
{
displaywords();
pop();
}
return 0;
}
void push(char word)
{
count = count + 1;
stack[count] = word;
}
void displaywords()
{
cout << "PUSHED " << " " << stack[count] << " ." << endl;
}
void pop()
{
count = count - 1;
}
那是因为您正在尝试读取 cin
。将 do
块中的 cin
更改为 infile
.
你的代码有不少问题。一个明显的原因是读取循环的条件是 while(infile.eof())
。这几乎肯定不是你想要的。 while(!infile.eof())
可能是您所想的,但这也行不通 correctly/dependably。
您也在打开 infile
,但是当您阅读时,您尝试从 cin
而不是 infile
阅读。
您还尝试使用 while(stack!=NULL)
,明显的目的是读取直到堆栈为空——但 stack
是一个数组。它永远不会比较等于 NULL。
由于您使用的是 C++,因此我会使用标准容器(例如 std::vector
或 std::deque
,有或没有 std::stack
适配器)。这个一般顺序上的东西应该更接近一点:
std::vector<std::string> strings;
std::infile("some file.txt");
std::string word;
while (infile >> word)
strings.push_back(word);
while (!strings.empty()) {
std::cout << strings.back();
strings.pop_back();
}
std::cin 从标准输入读取。您不会从流缓冲区中获取任何内容 - 它正在等待用户输入。