蘭陵N梓記

一指流沙,程序年华


  • 首页

  • 归档

  • 关于

  • 搜索
close

c++实现的stack

时间: 2009-06-11   |   分类: 技术     |   阅读: 687 字 ~2分钟

还是前一段时间需要任职资格考试,自己练习一下栈stack的简易实现,今天把它贴出来,暴露的接口与STL类似,没有实现iterator迭代器。实现有两种方式, 基于顺序存储与链式存储。栈的特点是“后进先出”,在数学表达式运算,编译语法分析中,程序函数调用时最为常见。

公共宏与异常类

#define NEW(var, T) do { /  
   try {                 /  
       var = new T;      /  
   } catch(...) {        /  
       var = NULL;       /  
   }                     /  
} while(0)  

#define DELETE(var) do { /  
    if(NULL != var) {    /  
       delete var;       /  
       var = NULL;       /  
    }                    /  
} while(0)  

template<typename T>  
struct Error {  
   Error(const char* pszInfo = "Overflow") {  
     printf("/nThrow a error, Info :%s/n", pszInfo);  
   }  
};

顺序存储

顺序存储,模板实现,其中参数T为栈的存储类型,参数SIZE表示最大存储的个数。

template<typename T, size_t SIZE>  
class Stack {  
public:  
    Stack() :  
        m_size(0) {  
    }  
    ~Stack() {}  

    bool push(const T& t) {  
        if (m_size == SIZE) {  
            return false;  
        }  

        m_data[m_size] = t;  
        m_size++;  
        return true;  
    }  

    T& pop() {  
        if (0 == m_size) {  
            throw Error<T> ("Overflow");  
        } else {  
            T& t = m_data[m_size];  
            m_size--;  
            return t;  
        }  
    }  

    void clear() {  
        m_size = 0;  
    }  

    const bool empty() const {  
        return 0 == m_size;  
    }  

    const size_t size() const {  
        return m_size;  
    }  

    // 遍历所有的节点  
    void traverse(void(*func)(T&)) {  
        if (empty()) {  
            return;  
        }  

        for (size_t idx = 0; idx < m_size; ++idx) {  
            func(m_data[idx]);  
        }  
    }  

private:  
    T m_data[SIZE];  
    size_t m_size;  
};  

链式存储

链式存储,也是模板实现,内部结构为一单向链表。入栈的元素加到链表的表头。

template<typename T>  
struct SNode {  
    T m_data;  
    SNode* m_pNext;  

    SNode() :  
        m_pNext(NULL) {  
    }  
};  

template<typename T>  
class LStack {  
    typedef SNode<T> TNode;  
public:  
    LStack() :  
        m_size(0)  
    {  
        NEW(m_pTop, TNode());  
        if (NULL != m_pTop) {  
            m_pTop->m_pNext = NULL;  
        }  
    }  

    ~LStack() {  
        clear();  
        DELETE(m_pTop);  
    }  

    void clear() {  
        if (NULL == m_pTop) {  
            return;  
        }  

        TNode* pTemp = m_pTop->m_pNext;  
        while (NULL != pTemp) {  
            TNode* pTemp2 = pTemp->m_pNext;  
            DELETE(pTemp);  
            pTemp = pTemp2;  
        }  
        m_pTop->m_pNext = NULL;  
        m_size = 0;  
    }  

    const bool empty() const {  
        return (NULL == m_pTop || NULL == m_pTop->m_pNext) ? true : false;  
    }  

    const size_t size() const {  
        return m_size;  
    }  

    bool push(const T& t) {  
        if (NULL == m_pTop)  
        {  
            return false;  
        }  

        TNode* pTemp = NULL;  
        NEW(pTemp, TNode());  
        if (NULL == pTemp) {  
            return false;  
        }  
        pTemp->m_data = t;  
        pTemp->m_pNext = m_pTop->m_pNext;  
        m_pTop->m_pNext = pTemp;  

        m_size++;  

        return true;  
    }  

    T& pop() {  
        TNode* pTemp = m_pTop->m_pNext;  
        if (NULL == pTemp) {  
            throw Error<T> ("Overflow");  
        }  

        T t = pTemp->m_data;  
        m_pTop->m_pNext = pTemp->m_pNext;  
        DELETE(pTemp);  
        m_size--;  
        return t;  
    }  

    // 遍历所有的节点  
    void traverse(void(*func)(T&)) {  
        if (empty()) {  
            return;  
        }  
        TNode* pTemp = m_pTop->m_pNext;  
        while (NULL != pTemp) {  
            func(pTemp->m_data);  
            pTemp = pTemp->m_pNext;  
        }  
    }  

private:  
    TNode* m_pTop;  
    size_t m_size;  
};

测试代码

void print_stack(int& a) {  
    printf("%d/t", a);  
}  

void test_stack() {  
    printf("stack test /n");  
    //Stack<int, 4> stack;  
    LStack<int> stack;  

    stack.push(1);  
    stack.push(2);  
    stack.push(3);  
    stack.pop();  
    stack.pop();  
    stack.pop();  
    stack.push(1);  
    stack.push(2);  
    stack.push(3);  

    printf("/n1 : size: %d /n", stack.size());  
    stack.traverse(print_stack);  

    stack.pop();  
    printf("/n2 : size: %d /n", stack.size());  
    stack.traverse(print_stack);  

    stack.push(4);  
    printf("/n3 : size: %d /n", stack.size());  
    stack.traverse(print_stack);  

    stack.pop();  
    printf("/n4 : size: %d /n", stack.size());  
    stack.traverse(print_stack);  

    stack.clear();  
    printf("/n5 : size: %d /n", stack.size());  
    stack.traverse(print_stack);  
}  
#c++#
c++技巧之宏Macro应用
用c++模板来展示new与delete操作符原理
微信扫一扫交流

标题:c++实现的stack
作者:兰陵子
关注:lanlingthink(览聆时刻)
声明:自由转载-非商用-非衍生-保持署名(创作共享3.0许可证)

  • 文章目录
  • 站点概览
兰陵子

兰陵子

Programmer & Architect

164 日志
4 分类
57 标签
GitHub 知乎
    • 公共宏与异常类
    • 顺序存储
    • 链式存储
    • 测试代码
© 2009 - 2022 蘭陵N梓記
Powered by - Hugo v0.101.0
Theme by - NexT
0%