LinkStack

#include <iostream>
using namespace std;

template <class T>
class Node
{
public:
    T data;
    Node *next;
    Node () { }
    Node (T d, Node *p): data(d), next(p) { }
};

template <class T>
class LinkStack
{
private:
    Node<T> *top;
public:
    LinkStack(): top(NULL) { }

    ~LinkStack() {makeEmpty(top); }
/*
    LinkStack(LinkStack<T> &L)
    {
        cpy(this, L.top);
    }

    void cpy(LinkStack<T> *s, Node<T> *x)
    {
        if(x->next) cpy(s, x->next);
        s->Push(x->data);
    }
*/
    void Push(const T &x) //
    {
        top = new Node<T>(x, top);
    }

    bool Pop(T &x) //
    {
        if(IsEmpty()) return false;

        getTop(x);
        Node<T> *d = top;
        top = top->next;
        delete d;
        return true;
    }

    bool getTop(T &x) const //
    {
        if(IsEmpty()) return false;
        x = top->data;
        return true;
    }

    bool IsEmpty() const { return (top == NULL) ? true : false; } //ok

    int getSize() const //ok
    {
        int ret = 0;
        for(Node<T> *p = top; p; p = p->next)
            ret++;
        return ret;
    }

    void makeEmpty(Node<T> *p) //
    {
        if (p) makeEmpty(p->next);
        delete p;
    }

    void output() //
    {
        Node<T> *temp = NULL;

        while(!IsEmpty())
        {
            T t;
            if(Pop(t)) cout << t << " ";
            temp = new Node<T> (t, temp);
        }
        cout << endl;
        top = temp;
    }
};

Mind:

  a.拷贝构造函数总是写不好, 好像因为析构函数的某个位置没搞好, 然后就导致了<< 没法重载, 写的好Low..

时间: 2024-10-13 23:27:19

LinkStack的相关文章

栈的的链式实例LinkStack实现

1.#include <stdio.h>#include <malloc.h>#include "LinkList.h" typedef struct _tag_LinkList{    LinkListNode header;    int length;} TLinkList; LinkList* LinkList_Create() // O(1){    TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkLis

linkStack 实现

底层调用的是linkList来实现linkStack. 由于linkList是通过linkListNode来串联起来的,而linkStack没有linkListNode结构体,因此需要定义一个结构体来满足linkList的要求,这个过程叫做适配. 注意内存的分配和释放,这也是C++赋予程序员的灵活. #ifndef LINKSTACK_H_INCLUDED #define LINKSTACK_H_INCLUDED typedef void linkStack; linkStack* linkSt

链栈的实现

链栈即链式栈,也就是说我们不用再考虑空间的大小,可随心所欲的进行数据的插入/删除了.和顺序栈一样,仍然要保持其stack的特性,只在一端进行插入和删除,后进先出. 示例代码: #ifndef _LINKSTACK_H #define _LINKSTACK_H typedef int ElemType; typedef int Status; typedef struct linkStack { ElemType data; struct linkStack * top; }linkStack;

堆栈(链栈)

#include<cstdlib> #include<iostream> #include<fstream> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef char SElemType; typedef struct StackNode{ SElemType data; struct StackNode *next; }S

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

数据结构Java实现05----栈:顺序栈和链式堆栈

数据结构Java实现05----栈:顺序栈和链式堆栈 一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适

数据结构之栈和队列

数据结构学习继续向前推进,之前对线性表进行了学习,现在我们进入栈和队列的学习.同样我们先学习一些基本概念以及堆栈的ADT. 栈和队列是两种中重要的线性结构.从数据结构角度看,栈和队列也是线性表,只不过是受限的线性表.因此可以称为限定性数据结构.但从数据类型来看,他们是和线性表大不相同的两类重要的抽象数据类型. 栈:(stack)是限定仅在表尾进行相应插入和删除操作的线性表.因此,对栈来说,表尾有其特殊含义,称为栈顶,表头称为栈底,不含元素的空表称为空栈.栈一个重要特性就是后进先出.OK,我们来看

栈的实现

栈的实现: 栈,仅限制在栈的一端进行插入和删除,用于插入与删除的一端为顶部.另一端为底端. 栈,定义为先进后出. 可以看到 插入以a1,a2,a3顺序进行,而删除以an ,an-1顺序进行 同样栈的实现也分为数组实现以及链式实现两种. 首先来介绍一下顺序实现 优点:顺序实现的出栈和入栈的执行速度会更加的快. 缺点:顺序实现的元素数量是有限的. 代码实现: public class Stack { private Node stack[]; int top = 0; Stack(){ stack

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点