数据结构——栈的示例

  数据结构——栈,是先进后出的一种数据结构,这里使用的是单链表实现的栈。

  栈大多应用在算法上,比如说递归算法,递归中比较典型的是斐波那契数列,即0, 1, 1, 2, 3, 5, 8...... 第三个数开始,每个数是前两数之和;四则运算表达式求值的逆波兰表示法,也叫后缀表示法,等等。

  栈的示例代码如下,本程序是在 Android 系统下的 Compiler C语言编译器下通过编译。

  结构体中的 data 代表数据元素,在实际应用中 data 应该是另一个结构体,并且定义数据项,如:姓名、性别、年龄、籍贯等等类似的数据项。

/*
  程序功能:数据结构-栈的示例
  说明:栈的入栈和出栈功能全部实现
  作者:冰雪青松
  邮箱:946585434@qq.com
  日期:2022.09.27
*/
#include<stdio.h>
#include<stdlib.h>

//自定义布尔类型
#define BOOL  int
#define OK    1
#define TRUE  1
#define ERROR 0
#define FALSE 0

typedef int Status;
typedef int SElemType;

//定义栈的结构体
// StackNode 等相当于面向对象的类
typedef struct StackNode
{
    SElemType data;
    struct StackNode *next;
}StackNode, *LinkStackPtr;

typedef struct LinkStack
{
    LinkStackPtr top;
    int count;
}LinkStack;

// sl 相当于面向对象的对象
LinkStack sl;
LinkStack* pl = &sl;
/*
  功能:入栈函数

  @param LinkStack* p 自定义结构体类型指针
  @param SElemType e  自定义数据类型
  @return Status      自定义数据类型
*/
Status Push(LinkStack* p, SElemType e)
{
    LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
    s->data = e;
    s->next = p->top;
    p->top = s;
    p->count++;
    return OK;
}

/*
  功能:判断空栈函数

  说明:空栈判断依据是 count 为 0

  @param LinkStack* S 自定义结构体类型指针
  @return BOOL        自定义布尔类型
*/
BOOL StackEmpty(LinkStack* S)
{
    if(S->count <= 0)
        return TRUE;
    else
        return FALSE;
}

/*
  功能:出栈函数

  @param LinkStack* S 自定义结构体类型的指针
  @param SElemTyoe* e 自定义数据类型的指针
  @return Status      自定义数据类型
*/
Status Pop(LinkStack* S, SElemType* e)
{
    LinkStackPtr p;
    
    if(StackEmpty(S))
    {
        *e = 0;
        return ERROR;
    }
        
    *e = S->top->data;
    p = S->top;
    S->top = S->top->next;
    free(p);
    S->count--;
    return OK;
}

/*
  功能:主函数入口
*/
int main()
{
    SElemType e;
    
    //进栈
    Push(pl, 580);
    
    //进栈
    Push(pl, 7809);
    
    //进栈
    Push(pl, 32);
    
    //出栈
    Pop(pl, &e);
    printf("%d ", e);
    
    //出栈
    Pop(pl, &e);
    printf("%d ", e);
    
    //出栈
    Pop(pl, &e);
    printf("%d ", e);
    
    //出栈
    Pop(pl, &e);
    printf("%d ", e);
    
    //出栈
    Pop(pl, &e);
    printf("%d ", e);
    
    return 0;
}

  进栈的顺序是:580, 7809, 32;出栈的顺序是:32, 7809, 580。先进后出,后进先出。

  后面的两个零其实是多出了两次栈。

程序执行后的效果:

ca28dc9ea5c54f8a8c51ff3dc58a4754.png

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰雪青松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值