1

我的代码没有像我预期的那样输出 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;
    }
};
4

2 回答 2

2

嗯……这取决于。做什么Stack"1"它打印多少个 s - 一个还是十个?

Stack无论如何看起来很奇怪:为什么你需要强制转换popif 它是模板化的string?我相信pop不会返回您认为返回的内容。

编辑

我复制了你的代码,我得到了 10 个带有线条的“1”。实际上,我以相反的顺序得到了文件的最后 10 行(对你来说很好的练习 - 弄清楚,这很有意义)。

如果你没有得到任何行并且只有 1 个“1”,我的猜测是程序找不到文件(可执行文件是从不同的目录执行的)

尝试将打印添加到getline循环中,看看您实际阅读了多少行。

于 2013-09-25T15:38:07.593 回答
0

您的堆栈假设(我没有完全检查它是否正确实施)按照 LIFO 原则(最后输入优先输出)工作,因为堆栈应该按照定义工作。所以你不应该期望前 10 个 pop 会返回前 10 行,它会返回最后一个。因此,您要么使用 FIFO 容器,要么使用弹出堆栈,直到获得最后 10 个项目(但仍以相反的顺序)。

于 2013-09-25T15:46:45.170 回答