码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-08-27 13:05:48      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:stack   构造函数   析构函数   

头文件

/**
* 书本:【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;
}


最近想了想是不是要恢复的以前的吧那些理论的东西也写进来呢?因为我们查博客的时候,但看程序的话,有些地方还是不懂的,虽然我写了大量的注释,但是感觉还是要有个层次性的东西。





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

标签:stack   构造函数   析构函数   

原文地址:http://blog.csdn.net/cutter_point/article/details/38867211

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!