您的位置:首页 > 编程语言 > C语言/C++

【ThinkingInC++】34、带有构造函数和析构函数的Stack

2014-08-27 11:12 507 查看

头文件

/**
* 书本:【ThinkingInC++】
* 功能:带有构造函数和析构函数的Stack
* 时间:2014年8月27日11:13:10
* 作者:cutter_point
*/
#ifndef STACK3_H_INCLUDED
#define STACK3_H_INCLUDED

class Stack
{
    struct Link
    {
        void* data;
        Link* next;
        Link(void* dat, Link* nxt);
        ~Link();
    }*head;
public:
    Stack();
    ~Stack();
    void push(void* dat);   //压入一个数据
    void* peek();   //返回栈的顶元素但是在栈中不删除元素
    void* pop();    //返回栈顶元素,并且从栈中删除这个元素
};

#endif // STACK3_H_INCLUDED




定义文件

/**
* 书本:【ThinkingInC++】
* 功能:关于Stack的够着函数
* 时间:2014年8月27日11:13:14
* 作者:cutter_point
*/

#include"Stack3.h"
#include"../require.h"

using namespace std;

/*
    struct Link
    {
        void* data;
        Link* next;
        Link(void* dat, Link* nxt);
        ~Link();
    }*head;
public:
    Stack();
    ~Stack();
    void push(void* dat);   //压入一个数据
    void* peek();   //返回栈的顶元素但是在栈中不删除元素
    void* pop();    //返回栈顶元素,并且从栈中删除这个元素
*/
Stack::Link::Link(void* dat, Link* nxt)
{
    data=dat;
    next=nxt;
}

//        ~Link();
Stack::Link::~Link()
{
}

//    Stack();
Stack::Stack()
{
    head=nullptr;
}

//    ~Stack();
Stack::~Stack()
{
    require(head == nullptr, "Stack not empty");
}

//    void push(void* dat);   //压入一个数据
void Stack::push(void* dat)
{
    head=new Link(dat, head);   //创建一个新节点,然后把原来的节点重新赋值给老节点
}

//    void* peek();   //返回栈的顶元素但是在栈中不删除元素
void* Stack::peek()
{
    require(head != nullptr, "Stack empty");
    return head->data;
}

//    void* pop();    //返回栈顶元素,并且从栈中删除这个元素
void* Stack::pop()
{
    if(head == nullptr)
        return 0;
    void* result=head->data;
    Link* oldHead=head;
    head=head->next;
    delete oldHead; //去除元素,回收内存空间
    return result;
}

/*
Link和Stack仅仅存放指针,但他们不负责清除这些指针
要知道由谁来清除这个对象,对于一个程序是成功还是失败来说是很关键的--这就是为什么
如果Stack对象销毁时不为空,Stack::~Stack()就会打印出错误信息的原因
*/


测试文件

/**
* 书本:【ThinkingInC++】
* 功能:测试程序的使用
* 时间:2014年8月27日11:13:20
* 作者:cutter_point
*/

#include"Stack3.cpp"
#include"../require.h"
#include<fstream>
#include<iostream>
#include<string>

using namespace std;

int main()
{
    ifstream in("Stack3Test.cpp");
    assure(in, "Stack3Test.cpp");
    Stack textlines;
    string line;

    while(getline(in, line))
        textlines.push(new string(line));   //压栈,倒序输出

    string* s;
    while((s=(string*)textlines.pop()) != 0)
    {
        cout<<*s<<endl;
        delete s;
    }

    return 0;
}


最近想了想是不是要恢复的以前的吧那些理论的东西也写进来呢?因为我们查博客的时候,但看程序的话,有些地方还是不懂的,虽然我写了大量的注释,但是感觉还是要有个层次性的东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: