html

数据结构:顺序栈的创建·插入·删除

数据结构:顺序栈的创建·插入·删除

栈的原理

​ 栈(stack),存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈(PUSH)、出栈(POP)的说法。

image

闭合的一端被称为栈底(Stack Bottom),允许数据的插入与删除的一端被称为栈顶(Stack Top),不包含任何元素的栈被称为空栈.
1.把数据插入到栈空间的动作被称为入栈或者压栈

image

​ 2 从栈空间中删除数据的动作被称为出栈或者弹栈

image
其中以数组作为基础实现栈空间称为顺序栈。数组在内存中占用一块连续的空间,也就是数组元素的内存地址是连续的。为了实现栈,一般是把数组头作为栈底,数组头部到数组尾部作为栈的增长方向,也就是用户只在数组尾部对数据进行插入和删除。

image

设计思路

(1) 创建一个空的顺序栈,并为记录顺序栈信息的结构体申请堆内存,并进行初始化即可!

(2) 根据栈的特性,把新元素从栈顶入栈,也就是从数组的尾部进行元素插入.

(3) 根据栈的特性,把元素从栈顶出栈,也就是把元素从数组的尾部把元素删除.

(4) 对顺序栈中的元素进行遍历,只需要从顺序栈的栈底开始向栈顶进行遍历.

代码

/**
  * @file       : 数据结构:顺序栈的创建·插入·删除
  * @brief      : 实现顺序栈的创建·插入·删除
  * @author	    : liuliu@163.com
  * @date 	    :2024/04/25
  * @version    :1.0
  * @note       :none
  * CopyRight(c ):  2023-2024   liuliu@163.com   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   : liuliu@163.com
  */
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   : liuliu@163.com
  */
 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   : liuliu@163.com
  */
  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   : liuliu@163.com
  */
  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   : liuliu@163.com
  */
  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   : liuliu@163.com
  */
  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;
  }
posted @ 2024-04-25 17:24  大螺丝贼六  阅读(178)  评论(0)    收藏  举报
html