创建一个在cpp中保存双精度的堆栈

时间:2013-12-05 15:56:00

标签: c++

在书中"思考C ++"有一个练习问题,要求创建一个包含双精度的堆栈,并填充25个双精度值,然后将它们打印到控制台。我对此问题的代码如下:

Stack.h

//Stack.h
struct Stack {
struct Link {
    void* data;
    Link* next;

    void initialize(void* dat, Link* nxt);
}* head;

void init();
void push(void* element);
void* pop();
void cleanup();
};

StackLib.cpp

#include "Stack.h"
#include <iostream>
using namespace std;

void Stack::init()
{
    head = 0;
}

void Stack::Link::initialize(void* dat, Link* nxt)
{
    data = dat;
    next = nxt;
}

void Stack::push(void* element)
{
    Link* newLink = new Link;
    newLink->initialize(element, head);
    head = newLink;
}

void* Stack::pop()
{
    if (head == 0) return 0;

    void* vp = head->data;
    Link* oldhead = head;
    head = head->next;
    delete oldhead;
    return vp;
}   

void Stack::cleanup()
{
    cout << "Clean up the Stack!" << endl;

    Link* tmpLink;
    while(head != 0){
        tmpLink = head->next;
        delete head;
        head = tmpLink;
    }
}

Test.cpp的

#include "Stack.h"
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{

    Stack dbStack;
    dbStack.init();

    int i;
    double d;


    for(i = 0; i < 25; i++){
        d = i/10.0;
        dbStack.push(&d);
    }

    for(i = 0; i < 25; i++)
        cout << *(double *)dbStack.pop() << endl;
}

执行程序时,输出为

2.4
2.4
2.4
2.4
(output omitted)

所有这些都是2.4,这不是我所期待的!那么我的代码有什么问题呢?

2 个答案:

答案 0 :(得分:3)

乍一看,问题可能就在这一行:

dbStack.push(&d);

您正在通过它的引用推送值,这意味着堆栈中的所有值都将与变量d

所拥有的最后一个值相同

答案 1 :(得分:-3)

这不是您正在寻找的答案,但正如评论者所说:

逐步执行您的代码。

那就是我要为你做的事情,然后我记得:教一个人钓鱼......

如果你没有使用IDE(但你应该),你可以添加print语句,以便在程序进行时显示变量的变化值。