首页 > 其他分享 >数据结构:顺序栈的创建·插入·删除

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

时间:2024-04-25 17:12:09浏览次数:28  
标签:Insert SeqStack return 删除 元素 插入 false 数据结构

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

目录

栈的原理

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

image-20240425165537885

image-20240425165806500

闭合的一端被称为栈底(Stack Bottom),允许数据的插入与删除的一端被称为栈顶(Stack Top),不包含任何元素的栈被称为空栈.

															1.把数据插入到栈空间的动作被称为入栈或者压栈

image-20240425170054778

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

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

image-20240425170520932

设计思路

(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

相关文章

  • 表格复选框的勾选,翻页后,表格顶部的删除按钮,是删除当前页的选中还是包括之前的选中?
    表格复选框的勾选状态在用户翻页后如何处理以及顶部的删除按钮作用范围(是仅删除当前页选中项还是包括前一页已选中的项),取决于应用程序的具体设计和实现方式。通常存在以下两种情况:仅删除当前页选中项:如果应用程序设计为每次翻页后仅保留当前页面的选中状态,即不跨页记忆选中......
  • mybatis只sql语句插入新行后返回主键自增列或者非自增列
    1.执行完insert语句,返回自增列最新的值。两种方式<insertid="create"parameterType="com.xcg.webapp.model.entity.Production"useGeneratedKeys="true"keyProperty="production_id">insertintoproduction(production_code,prod......
  • Linux给文件隔两个字符插入-
    需求:如下maclist.txt文件,每行都是固定个数字符串,现在需要在每行隔两个字符插入一个- 解决方案:使用sed命令进行插入替换,并将内容重新写入new.txt文件中sed  s/是sed替换命令参数,\(.\)匹配任意一个字符,\1和\2分别引用第一个和第二个括号内匹配的值,-是要插入的字......
  • 双向循环链表实现插入、删除和遍历功能接口
    /************************************************************************************filename:004_双向循环链表.c*author:[email protected]*date:2024/04/25*function:设计双向循环链......
  • 单向循环链表的删除与插入
    单向循环链表单向循环链表是一种数据结构,它在单向链表的基础上进行了扩展。在单向链表中,最后一个节点的指针域为空,即指向NULL。而在单向循环链表中,最后一个节点的指针域不再指向NULL,而是指向链表的头节点,从而形成一个环状的链表结构。单向循环链表有两种主要类型:带头指针的单向......
  • 数据结构:双向循环链表的创建·插入·删除
    数据结构:双向循环链表的创建·插入·删除/***@filename:数据结构:双向循环链表的创建·插入·删除*@brief:实现双向循环链表的创建·插入·删除*@author :[email protected]*@date :2024/04/24*@version:2.0*@note:none*CopyRig......
  • blog.admin 查询增加过滤器,添加、删除增加数据审计、统一控制权限操作
    一、查询增加过滤器需求说明:有几张表(医生表、病人表等),有个字段ClinicID都与诊所表主键Id关联。用户登录系统时候,根据所分配的诊所权限,只查看自己诊所的数据。通过查询过滤器,在查询每个表的时候,自动将ClinicID==当前登录用户所属ClinicID,添加上。1、创一个IClinicEntity接口usi......
  • 数据结构——单向循环链表
    一、单向循环链表(一)单向循环链表的构造单向循环链表的尾结点的指针域中必须指向链表的首结点的地址1)构造单向循环链表的结点//单向循环链表中的结点有效数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造单向循环链表的结点,链表中所有结点的数据类型应该......
  • C语言数据结构:链式栈及其出入栈
    /***********************************************************************************************************实现链式栈一般是以链表作为基础,一般是把链表头部作为栈顶,方便数据的插入和删除,链式栈相当于是一个单向不循环的链表。****Copyright(c)2023-2......
  • C语言数据结构:双向循环链表的增删操作
    /***********************************************************************************************************设计双向循环链表的接口****Copyright(c)[email protected]**********************************************......