我的代码没有像我预期的那样输出main.cpp的前10行。请告诉我为什么。谢谢!
#include "TStack.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[]) {
ifstream in("main.cpp");
Stack<string> textlines;
string line;
while (getline(in, line)) {
textlines.push(new string(line));
}
string* s;
for (int i = 0; i < 10; i++) {
cout << "1" << endl;
if((s = (string*)textlines.pop())==0) break;
cout << *s << endl;
delete s;
}
}
以下是标题。以下是标题。以下是标题。以下是标题。以下是标题。
#ifndef stackex_TStack_h
#define stackex_TStack_h
template <class T>
class Stack {
struct Link{
T* data;
Link* next;
Link(T* dat, Link* nxt): data(dat), next(nxt) {}
}* head;
public:
Stack() : head(0) {}
~Stack() {
while(head)
delete pop();
}
void push(T* dat) {
head = new Link(dat, head);
}
T* peek() const {
return head ? head->data : 0;
}
T* pop() {
if(head == 0) return 0;
T* result = head->data;
Link* oldHead = head;
head = head->next;
delete oldHead;
return result;
}
};
答案 0 :(得分:2)
Stack
做了什么?它打印了多少"1"
- 一个或十个?
无论如何, Stack
看起来很奇怪:如果在pop
上模板string
,你为什么要投出?{1}}?我相信pop
不会返回您认为它返回的内容。
修改强>
我复制了你的代码,我得到10“1”,带有线条。我实际上以相反的顺序得到文件的最后10行(对你来说很好的锻炼 - 想出来,这很有道理)。
如果你没有获得任何行,只有1“1”,我的猜测是程序找不到文件(可执行文件是从不同的目录执行的)
尝试将打印件添加到getline
循环中,并查看实际读取的行数。
答案 1 :(得分:0)
你的堆栈假设(我没有完全检查它是否被正确实现)来处理LIFO原理(Last Input First Output),因为堆栈应该按照定义工作。所以你不应该期望前10个弹出会返回前10行,它会返回最后一个。所以你要么使用FIFO容器,要么使用pop stack,直到你得到最后10个项目(但仍然是相反的顺序)。