数据结构 创建栈 压栈 删除栈顶元素 清空栈 遍历栈 例子

本文详细介绍了栈的基本操作,包括栈的初始化、压栈、遍历、删除栈顶元素及清空栈,并通过具体代码实现了这些功能。

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

本例子讲述了如何创建一个栈,压栈即往栈里插入一个结点,删除栈顶元素,以及对栈里的结点进行清空,遍历栈里的结点

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <errno.h>

typedef struct Node
{
    int data;  //数据域
    struct Node *pNext;  //指针域
}NODE, *PNODE;

typedef struct Stack
{
    PNODE pTop; //栈顶
    PNODE pBottom; //栈底
}TSTACK, *PSTACK;

//初始化栈
int  init(PSTACK _pSt)
{
    _pSt->pTop = (PNODE)malloc(sizeof(NODE)); //为栈顶分配内存
    if(NULL == _pSt->pTop)
    {
        printf("----malloc fail errno= %d\n", errno);
        return -1;
    }
    else
    {
        _pSt->pBottom = _pSt->pTop; //栈底指向了栈顶
        _pSt->pBottom->pNext = NULL; //将栈底指针域赋为空
    }

    return 0;
}

//压栈,往栈里写数据
int push_stack(PSTACK _pSt, int _iVal)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if(NULL == pNew)
    {
        printf("----Push_stack fail, errno\n", errno);
        return -1;
    }
    else
    {
        
        pNew->data = _iVal; //将待入栈的数据写入数据域中
        pNew->pNext = _pSt->pTop; //将新结点的指针域指向之前的栈顶
        _pSt->pTop = pNew;   //栈顶指向新结点  
    }
}

//判断栈是否为空栈
int  Is_empty(PSTACK _pSt)
{
    if(_pSt->pTop == _pSt->pBottom) //如果栈顶与栈底相等说明栈为空
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

//对栈进行遍历
void ergodic_stack(PSTACK _pSt)
{
    if(1 == Is_empty(_pSt))
    {
        printf("----This stack is empty\n");
    }
    else
    {
        PNODE Temporary_node;
        Temporary_node = _pSt->pTop;
        while(Temporary_node != _pSt->pBottom) //不等于栈底
        {
            printf("%d ", Temporary_node->data);
            Temporary_node = Temporary_node->pNext;
        }
        printf("\n");
    }
}

//删除栈顶元素
void pop_stack(PSTACK _pSt)
{
    if(1 == Is_empty(_pSt))
    {
        printf("----This stack is empty\n");
    }
    else
    {
        PNODE Temporary_node;
        Temporary_node = _pSt->pTop;
        _pSt->pTop = _pSt->pTop->pNext;

        free(Temporary_node);
        Temporary_node = NULL;
    }  
}

//清空栈
void clear_stack(PSTACK _pSt)
{
    if(1 == Is_empty(_pSt))
    {
        printf("----This stack is already empty\n");
    }
    else
    {
        PNODE p = _pSt->pTop;
        PNODE q = NULL;

        while(p != _pSt->pBottom)
        {
            q = p->pNext;
            free(p);
            p = q;
        }

        _pSt->pTop = _pSt->pBottom; //栈顶指向栈底        
    }
}

int main(int argc, char* argv[])
{
    TSTACK St;
    int iVal = 0;
    int i = 0;
     
    if(-1 == init(&St))
    {
        return -1;
    }

    while(i < 5)
    {
        printf("----Please input insert val to stack\n");
        scanf("%d", &iVal);
    
        push_stack(&St, iVal);
        i++;
    }

    ergodic_stack(&St); //对栈进行遍历

    pop_stack(&St);
    ergodic_stack(&St); //删除栈顶元素后再次进行遍历

    clear_stack(&St);
    ergodic_stack(&St); //清空栈元素后再次进行遍历

    return 0;
}

1 初始化栈

  初始化栈时为栈顶和栈底指向同一个结点,即栈顶指向栈底

2 压栈

  压栈即往栈里插入一个结点,因为栈里插入元素只能插入到栈顶,所以压栈的步骤是,

 先创建一个新结点,然后把数据赋值到新结点数据域中,最后将栈顶指向新结点

3 遍历栈

  因为栈时先进后出,所以栈顶元素先出来,栈底元素后出来。

 先定义一个新结点指针,新结点指向栈顶元素,进入while循环判断,如果新结点不等于栈底,则输出数据域,再将新结点指向新结点的下一个结点,以此进行

循环判断

4 删除栈结点

  因为删除栈结点时,必选从栈顶开始删除,所以删除一个栈元素,就是将栈顶元素删除,使栈顶指向下一个结点


本程序的步骤,1 初始化栈

         2 往栈里插入五个结点,然后进行遍历输出,会输出5个结点的数据

                3 删除一个栈元素,然后进行遍历输出,会输出4个节点的的数据

      4 将栈进行清空,然后进行遍历输出,会提示栈为空

程序运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值