【ThinkingInC++】34、带有构造函数和析构函数的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;
}


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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值