C++版,链栈的实现,简单易懂

本文通过详细的代码示例,介绍了如何使用C++手动实现栈这一数据结构。从节点定义到栈的基本操作,如压栈、出栈等,都进行了详尽的解释。

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

一、废话不多说,直接看代码

#include <iostream>
using namespace std;

// 定义栈中的节点
typedef struct node
{
    int data;       // 栈中节点的数据域
    node *next;     // 栈中节点指针
}node;

// 定义管理栈的结构体
typedef struct linkStack
{
    int size;       // 栈的容量
    node *top;      // 栈顶指针
}linkStack;

// 生成一个管理栈的节点
linkStack *initStack(void)
{
    linkStack *s = new linkStack;

    if(!s)
    {
        cout << "动态分配内存空间失败\n";
        return NULL;
    }

    s->size = 0;
    s->top = NULL;

    return s;
}

// 生成一个栈中节点
node *initNode(void)
{
    node *p = new node;

    if(!p)
    {
        cout << "动态分配内存空间失败\n";
        return NULL;
    }

    p->data = 0;
    p->next = NULL;

    return p;
}

// 压栈
bool push(linkStack *s, node *p)
{
    if(!s || !p)
    {
        return false;
    }

    p->next = s->top;   // 把新的栈节点插入到栈顶
    s->top = p;         // 修改栈顶指针
    s->size++;          // 修改栈的容量

    return true;
}

// 出栈
bool pop(linkStack *s, int *data)
{
    if(!s || !s->size)
    {
        return false;
    }

    node *tmp = s->top;     // 临时保存栈顶指针
    *data = tmp->data;      // 取出栈顶元素
    s->top = tmp->next;     // 修改栈顶指针
    s->size--;              // 修改栈的容量
    delete tmp;

    return true;
}

// 取栈顶元素
bool getTop(linkStack *s, int *data)
{
    if(!s || !s->size)
    {
        return false;
    }

    *data = s->top->data;   // 取栈顶元素

    return true;
}

// 判断是否为空栈
int isEmpty(linkStack *s)
{
    if(!s)
    {
        return -1;
    }

    return s->size > 0;
}

// 获取栈的容量
int stackLength(linkStack *s)
{
    if(!s)
    {
        return -1;
    }

    return s->size;
}

// 清空栈
bool clearStack(linkStack *s)
{
    if(!s)
    {
        return false;
    }

    node *tmp;
    for(int i = 0; i < s->size; i++)
    {
        tmp = s->top;
        s->top = tmp->next;
        delete tmp;
    }
    s->top = NULL;
    s->size = 0;

    return true;
}

// 销毁栈
bool destroyStack(linkStack *s)
{
    if(clearStack(s))
    {
        delete s;
        return true;
    }

    return false;
}


int main()
{
    int i, data;
    node *p;
    linkStack *s;
    s = initStack();

    if(!s)
    {
        cout << "初始化栈管理节点失败\n";
        return -1;
    }

    while(1)
    {
        cout << "请选择你的操作, 1.压栈 2.出栈 3.栈的容量 4.判空 5.清空栈 6.销毁栈 7.退出 ";
        cin >> i;

        switch(i)
        {
            case 1:
                p = initNode();

                if(!p)
                {
                    cout << "初始化栈中节点失败\n";
                    break;
                }

                cout << "请输入压栈数据:";
                cin >> p->data;

                if(push(s, p))
                {
                    cout << "压栈成功\n";
                }
                else
                {
                    cout << "压栈失败\n";
                }
                break;
                
            case 2:
                if(pop(s, &data))
                {
                    cout << "栈顶元素:" << data << endl;
                }
                else
                {
                    cout << "空栈\n";
                }
                break;

            case 3:
                data = stackLength(s);
                if(data > -1)
                {
                    cout << "栈的容量:" << data << endl;
                }
                else
                {
                    cout << "栈不存在\n";
                }
                break;

            case 4:
                data = isEmpty(s);
                if(data > 0)
                {
                    cout << "栈非空\n";
                }
                else if(data == 0)
                {
                    cout << "空栈\n";
                }
                else if(data == -1)
                {
                    cout << "栈不存在\n";
                }
                break;

            case 5:
                if(clearStack(s))
                {
                    cout << "清空成功\n";
                }
                else
                {
                    cout << "栈不存在\n";
                }
                break;

            case 6:
                if(destroyStack(s))
                {
                    s = NULL;
                    cout << "销毁成功\n";
                }
                else
                {
                    cout << "栈不存在\n";
                }
                break;
        }

        if(i == 7)
        {
            cout << "你已退出\n";
            break;
        }
    }

    return 0;
}

 

二、简单分析

        如果你学过数据结构,不是很理解栈,看这个会对你有很大的帮助,代码里的注释到位,易错点指出,认真看基本能看懂。难点就是如何定义一个栈,有很多种方法,一种像这里的,先定义一个管理的结构体,然后在用这个管理的结构体来管理栈中的节点,操作方便;另外一种是不定义管理的结构体,直接用栈中节点来自我管理,操作有点难理解。

三、小小总结

        别顾着看,自己动手默写一下,看看会多少,下期更新队列^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值