数据结构与算法 | 栈

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端为栈顶,另一端为栈底。栈中元素遵循先进后出的原则
假设我们依次将1, 2, 3, 4压入栈中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当我们再全部出栈时,就从1,2,3,4变成了4,3,2,1

这就是栈的先进后出的规则,知晓了原理,下一步就开始实现。
这里我们结合栈的特性,选用顺序表来实现更优一些,而下期的队列则用链表实现

数据结构
typedef struct Stack
{DataType* data;int top;		// 栈顶int capacity;  // 容量 
}Stack;
实现的接口
// 初始化栈 
void StackInit(Stack* ps);
// 入栈 
void StackPush(Stack* ps, DataType data);
// 出栈 
void StackPop(Stack* ps);// 获取栈顶元素 
DataType StackTop(Stack* ps);
// 获取栈中有效元素个数 
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零(1),如果不为空返回0 
int StackEmpty(Stack* ps);
// 销毁栈 
void StackDestroy(Stack* ps);
//确认是否需要扩容
void ChackCapacity(Stack* ps);

初始化栈

void StackInit(Stack* ps)
{ps->data = (DataType*)malloc(STACKSIZE * sizeof(DataType));ps->top = 0;ps->capacity = STACKSIZE;
}

检查栈是否扩容

void ChackCapacity(Stack * ps)
{if (ps->top >= ps->capacity){ps->capacity *= 2;ps->data = (DataType*)realloc(ps->data, ps->capacity * sizeof(DataType));}
}

我们只需要判断栈顶是否超过当前容量,超过后重新分配给多空间即可

入栈

void StackPush(Stack* ps, DataType data)
{ChackCapacity(ps);ps->data[ps->top++] = data;
}

每次将数据放在栈顶的位置,再将栈顶往后推

出栈

void StackPop(Stack* ps)
{if (0 == ps->top)return;ps->top--;
}

出栈只需要把栈顶指针回退一格即可,这样我们就不能通过栈顶来访问出栈的位置

获取栈顶元素

DataType StackTop(Stack* ps)
{if (0 == ps->top)return (DataType)0;return ps->data[ps->top - 1];
}

因为我们的栈顶时刻处于栈顶元素的后一个,所以只需要返回栈顶的前一个位置即可

获取栈中有效元素个数

int StackSize(Stack* ps)
{return ps->top;
}

直接返回栈顶的位置

检测栈是否为空

int StackEmpty(Stack* ps)
{return ps->top == 0;
}

当栈顶处于栈底的位置时,说明栈为空

销毁栈

void StackDestroy(Stack* ps)
{free(ps->data);ps->data = NULL;ps->top = 0;ps->capacity = 0;
}

在这里插入图片描述

完整代码
头文件

#include
#include
#include
#define _CRT_SECURE_NO_WARNINGS
#define STACKSIZE 10
typedef int DataType;
typedef struct Stack
{DataType* data;int top;		// 栈顶int capacity;  // 容量 
}Stack;// 初始化栈 
void StackInit(Stack* ps);
// 入栈 
void StackPush(Stack* ps, DataType data);
// 出栈 
void StackPop(Stack* ps);// 获取栈顶元素 
DataType StackTop(Stack* ps);
// 获取栈中有效元素个数 
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零(1),如果不为空返回0 
int StackEmpty(Stack* ps);
// 销毁栈 
void StackDestroy(Stack* ps);
//确认是否需要扩容
void ChackCapacity(Stack* ps);

函数实现

#include"Stack.h"void ChackCapacity(Stack* ps)
{if (ps->top >= ps->capacity){ps->capacity *= 2;ps->data = (DataType*)realloc(ps->data, ps->capacity * sizeof(DataType));}
}
void StackInit(Stack* ps)
{ps->data = (DataType*)malloc(STACKSIZE * sizeof(DataType));ps->top = 0;ps->capacity = STACKSIZE;
}// 入栈 
void StackPush(Stack* ps, DataType data)
{ChackCapacity(ps);ps->data[ps->top++] = data;
}// 出栈 
void StackPop(Stack* ps)
{if (0 == ps->top)return;ps->top--;
}// 获取栈顶元素 
DataType StackTop(Stack* ps)
{if (0 == ps->top)return (DataType)0;return ps->data[ps->top - 1];
}// 获取栈中有效元素个数 
int StackSize(Stack* ps)
{return ps->top;
}// 检测栈是否为空,如果为空返回非零(1),如果不为空返回0 
int StackEmpty(Stack* ps)
{return ps->top == 0;
}// 销毁栈 
void StackDestroy(Stack* ps)
{free(ps->data);ps->data = NULL;ps->top = 0;ps->capacity = 0;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部