数据结构:顺序栈的创建·插入·删除
目录栈的原理
栈(stack),存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈(PUSH)、出栈(POP)的说法。
闭合的一端被称为栈底(Stack Bottom),允许数据的插入与删除的一端被称为栈顶(Stack Top),不包含任何元素的栈被称为空栈.
1.把数据插入到栈空间的动作被称为入栈或者压栈
2 从栈空间中删除数据的动作被称为出栈或者弹栈
其中以数组作为基础实现栈空间称为顺序栈。数组在内存中占用一块连续的空间,也就是数组元素的内存地址是连续的。为了实现栈,一般是把数组头作为栈底,数组头部到数组尾部作为栈的增长方向,也就是用户只在数组尾部对数据进行插入和删除。
设计思路
(1) 创建一个空的顺序栈,并为记录顺序栈信息的结构体申请堆内存,并进行初始化即可!
(2) 根据栈的特性,把新元素从栈顶入栈,也就是从数组的尾部进行元素插入.
(3) 根据栈的特性,把元素从栈顶出栈,也就是把元素从数组的尾部把元素删除.
(4) 对顺序栈中的元素进行遍历,只需要从顺序栈的栈底开始向栈顶进行遍历.
代码
/**
* @file : 数据结构:顺序栈的创建·插入·删除
* @brief : 实现顺序栈的创建·插入·删除
* @author : [email protected]
* @date :2024/04/25
* @version :1.0
* @note :none
* CopyRight(c ): 2023-2024 [email protected] All Right Reseverd
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
//定义节点中的数据域类型
typedef int Data_t;
//定于栈并起别名
typedef struct Seqlist_Stack{
Data_t * bottom;//栈底指针
unsigned int size;//栈的大小
unsigned int top;//栈顶元素的下标
}SeqStack_t;
//创建一个空栈,其中含有一个栈顶指针和栈的大小并初始化
/**
* @function: SeqStack_Creat
* @brief : 创建一个空栈
* @param : @unsigned size:栈的容量
* @retval : @SeqStack_t *,返回栈地址
* @date : 2024/04/24
* @version : 1.0
* @note : none
* author : [email protected]
*/
SeqStack_t * SeqStack_Creat(unsigned int size)
{
SeqStack_t *SeqStack=( SeqStack_t *)calloc(1,sizeof( SeqStack_t ));//为栈申请一块堆内存
//判断是否创建成功
if(SeqStack==NULL)
{
perror("calloc memory for SeqStack is failed ");
free(SeqStack);
return NULL;
}
SeqStack->bottom=(Data_t *)calloc(1,sizeof(Data_t));
if(SeqStack->bottom==NULL)
{
perror("calloc memory for bottom is failed ");
free(SeqStack->bottom);
return NULL;
}
SeqStack->size=size;
SeqStack->top=-1;
return SeqStack;
}
//判断栈是否为空
/**
* @function: SeqStack_IsEmpoty
* @brief : 判断栈是否为空
* @param : @SeqStack_t *SeqStack:需要判断的栈
* @retval : @bool空返回true.否则返回false
* @date : 2024/04/24
* @version : 1.0
* @note : none
* author : [email protected]
*/
bool SeqStack_IsEmpoty(SeqStack_t *SeqStack)
{
if(SeqStack->top==-1)
{
return true;
}
return false;
}
//判断栈是否已满
/**
* @function: SeqStack_IsFul
* @brief : 判断栈是否已满
* @param : @SeqStack_t *SeqStack:需要判断的栈
* @retval : @bool满返回true.否则返回false
* @date : 2024/04/24
* @version : 1.0
* @note : none
* author : [email protected]
*/
bool SeqStack_IsFul(SeqStack_t *SeqStack)
{
if(SeqStack->size==SeqStack->top+1)
{
return true;
}
return false;
}
//在栈中插入一个数据,只能在栈顶插入
/**
* @function: SeqStack_Insert
* @brief : 在栈中插入一个数据
* @param : @SeqStack_t *SeqStack:需要插入的栈
: @Data_t data:插入的数据
* @retval : @bool插入成功返回true.否则返回false
* @date : 2024/04/24
* @version : 1.0
* @note : none
* author : [email protected]
*/
bool SeqStack_Insert(SeqStack_t *SeqStack,Data_t data)
{
if(SeqStack==NULL)
{
return false;
}
//判断栈是否已满
if(SeqStack_IsFul(SeqStack))
{
printf("Stack is full\n");
return false;
}
//没有满
SeqStack->bottom[++SeqStack->top]=data;//插入并栈顶下标加一
return true;
}
//在栈中删除元素,只能在栈顶删,也就是把顶部元素出栈,需要备份出栈元素
/**
* @function: SeqStack_Del
* @brief : 在栈中删除元素
* @param : @SeqStack_t *SeqStack:需要插入的栈
* @retval : @bool插入成功返回true.否则返回false
* @date : 2024/04/24
* @version : 1.0
* @note : none
* author : [email protected]
*/
bool SeqStack_Del(SeqStack_t *SeqStack)
{
Data_t temp;//备份出栈元素
//栈为空
if(SeqStack_IsEmpoty(SeqStack))
{
printf("Stack is empoty\n");
return false;
}
//非空
temp=SeqStack->bottom[SeqStack->top--];
return true;
}
//遍历栈并打印出元素
/**
* @function: SeqStack_Print
* @brief : 遍历栈并打印出元素
* @param : @SeqStack_t *SeqStack:需要遍历的栈
* @retval : none
* @date : 2024/04/24
* @version : 1.0
* @note : none
* author : [email protected]
*/
void SeqStack_Print(SeqStack_t *SeqStack)
{
//栈为空
if(SeqStack_IsEmpoty(SeqStack))
{
printf("Stack is empoty\n");
return;
}
//栈不为空
for(int i=0;i<=SeqStack->top;i++)
{
printf("%d",SeqStack->bottom[i]);
printf(" ");
if(i==SeqStack->top)
{
printf("\n");
}
}
}
//进行测试
int main()
{
//首先创建一个栈
SeqStack_t *SeqStack=SeqStack_Creat(5);
//遍历输出
SeqStack_Print(SeqStack);
//插入元素
SeqStack_Insert(SeqStack,1);
SeqStack_Insert(SeqStack,2);
SeqStack_Insert(SeqStack,3);
SeqStack_Insert(SeqStack,4);
SeqStack_Insert(SeqStack,5);
//遍历输出
SeqStack_Print(SeqStack);
//删除元素
SeqStack_Del(SeqStack);
SeqStack_Del(SeqStack);
SeqStack_Del(SeqStack);
//遍历输出
SeqStack_Print(SeqStack);*/
//继续插入元素
SeqStack_Insert(SeqStack,1);
SeqStack_Insert(SeqStack,2);
//遍历输出
SeqStack_Print(SeqStack);
return 0;
}
标签:Insert,SeqStack,return,删除,元素,插入,false,数据结构
From: https://www.cnblogs.com/liuliuye/p/18158150