栈 (Stack) 的C++实现(链表方法)

本文介绍如何使用C++实现栈数据结构,基于链表方法,包含栈的类定义、插入、删除、获取栈头元素、计算栈长度、清空栈及判断栈是否为空等功能,并提供了调用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目源代码

本文项目源代码可在此处下载(Visual Studio 2013项目文件):https://github.com/Voyager2718/Blog/tree/master/stack


简介

栈 (Stack) 是一种先进后出 (LIFO - Last in, first out) 的数据结构。
先进先出的意思很简单,比如:
假设我们往一个栈依次插入 1 2 3 4 5,那么当我们取出的时候将是 5 4 3 2 1。因为 5 是最后一个插入的元素,所以我们可以说 5 是在栈头。因此当我们取出栈元素的时候,总是先取出 5,然后是 4, 3, 2, 1。
相对于链表等数据结构,栈的实现难度较低,在特定场合使用效率也比较高
其实栈可以说是一个简单化的单向链表,你也可以看一下这篇关于单向链表的文章:http://blog.youkuaiyun.com/voyager3/article/details/49975401


栈的类定义

template<typename T>
class stack  {
private:
    struct _node{
        T element;
        _node *next;
    };
    _node *_pnode;
    int _size;
public:
    stack() :_size(0), _pnode(nullptr) {}
    ~stack(){ empty(); }
    void push(T);
    T pop(void);
    T get(void);
    int size(void);
    void empty(void);
    bool isEmpty(void);
};

插入数据

template <typename T>
void stack<T>::push(T element){
    _node *node = new _node();
    node->element = element;
    if (_size == 0)
        node->next = nullptr;
    else
        node->next = _pnode;
    _pnode = node;
    _size++;
}

取出并删除头数据

template<typename T>
T stack<T>::pop(void){
    if (_size == 0)
        throw new IndexOutOfRangeException();
    T t = _pnode->element;
    _node *tmp_node = _pnode;
    _pnode = _pnode->next;
    delete (tmp_node);
    _size--;
    return t;
}

取得头数据(不删除)

template <typename T>
T stack<T>::get(void){
    if (_size == 0)
        throw new IndexOutOfRangeException();
    return _pnode->element;
}

获得栈长度

template <typename T>
int stack<T>::size(){
    return _size;
}

清空栈

template <typename T>
void stack<T>::empty(){
    if (_size == 0)
        return;
    _node *tmp_node = _pnode;
    while (tmp_node->next != nullptr)
    {
        tmp_node = tmp_node->next;
        delete(_pnode);
        _pnode = tmp_node;
    }
    delete(_pnode);
    _pnode = nullptr;
    _size = 0;
}

确定栈是否为空

template <typename T>
bool stack<T>::isEmpty(){
    return _size == 0;
}

Exception 的定义

class Exception{
private:
    string message;
public:
    Exception(string message){
        this->message = string(message);
    }

    Exception(){}

    string getMessage(){
        return message;
    }
};

class IndexOutOfRangeException :public Exception{};

调用例子

int main(int argc, char *argv[]){
    stack<int> *st = new stack<int>();
    st->push(10);
    st->push(20);
    cout << st->pop() << endl;
    cout << st->pop() << endl;
    cout << st->pop() << endl;
    system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值