数据结构——栈,是先进后出的一种数据结构,这里使用的是单链表实现的栈。
栈大多应用在算法上,比如说递归算法,递归中比较典型的是斐波那契数列,即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。先进后出,后进先出。
后面的两个零其实是多出了两次栈。
程序执行后的效果: