【数组栈】实现

简介: 【数组栈】实现



我们已经学习过了【线性表】中的顺序表和链表。今天开始进入栈和队列。栈和队列是顺序表和链表的延续,也是一种线性表(线性表在逻辑上也是连续的)。大体结构上都很相似,所以大家学习起来也会很容易的。但是栈和队列也有自己独特的性质,学习也需要特别注意哦。

栈的概念及其结构

:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。

栈中的数据元素遵守 后进先出 / 后进先出 LIFO(Last In First Out)的原则

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

【先进后出/后进先出】可以类比【弹夹】

栈的实现

了解了栈的概念,如何实现栈呢?

根据前面博文我们可以【数组栈】和【链式栈】

数组栈

数组栈比较简单,也是快速容易实现,首先就是【数组栈】实现。

链式栈

链式栈分为【单链表】和【双向链表】去实现栈。毋庸置疑,【双向链表实现】栈顶可以是尾巴,也可以是头,因为双向链表的头插/头删和尾插/尾删都是很方便的。

但是为了节省资源,我们用【单链表】该怎样去设计呢?

单链表实现栈栈顶只能是单链表头(头插/头删易),栈底只能是单链表尾(头删很复杂)

栈的常见接口实现

  • 断言NULL/Pop==0情况
  • 改变结构体用指针
  • top的指向
  • 单个数据直接用,多个数据用结构体包含起来
  • 数组的数据访问用数组下标即可访问
  • pst和pst->a搞清楚!
  • 入栈顺序是只有一种,但是出栈顺序有多种!!

主函数Test.c

#include"Stack.h"
int main()
{
  ST pst;//创建结构体
  STInit(&pst);//传地址是修改结构体内部
  STPush(&pst, 1);
  STPush(&pst, 2);
  STPush(&pst, 3);
  STPush(&pst, 4);
  STPush(&pst, 5);
  while (!STempty(&pst))
  {
    printf("%d ", STTop(&pst));
    STPop(&pst);
  }
  STDestroy(&pst);
}

由于栈是其只允许在固定的一端进行插入和删除元素操作。所以栈的访问是必须先Pop弹出元素才能访问下一个元素。

while (!STempty(&pst))
  {
    printf("%d ", STTop(&pst));
    STPop(&pst);
  }

头文件&函数声明Stack.h

头文件

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

函数声明

  • 创建结构体
typedef int STDatatype;
typedef struct Stack
{
  STDatatype* a;
  int top;
  int capacity;
}ST;
  • 初始化
void STInit(ST* pst);
  • 释放销毁
void STDestroy(ST* pst);
  • 压栈
void STPush(ST* pst, STDatatype x);
  • 出栈
void STPop(ST* pst);
  • 栈顶元素
STDatatype STTop(ST* pst);
  • 判断栈是否为NULL
bool STempty(ST* pst);
  • 栈内的元素个数
int STSize(ST* pst);

函数实现Stack.c

初始化SLInit

如果初始化 top=0:表示栈内元素的个数。作为a[top]指针指向栈顶元素的下一个。

如果初始化 top=-1:表示数组元素的下标。作为a[top]指针指向栈顶元素。

#include"Stack.h"
void STInit(ST* pst)
{
  assert(pst);
  pst->a = 0;
//表示top指向栈顶元素的下一个位置
  pst->top = 0;
//表示top指向栈顶元素
  //pst->top = -1;
  pst->capacity = 0;
}

扩容Createcapacity

void Createcapacity(ST* pst)
{
  //扩容
  if (pst->top == pst->capacity)
  {
    int newcapacity = pst->capacity == 0 ? 4 : 2 * pst->capacity;
    STDatatype* tmp = (STDatatype*)realloc(pst->a, sizeof(ST) * newcapacity);
    if (tmp == NULL)
    {
      perror("realloc fail");
      return;
    }
    pst->a = tmp;
    pst->capacity = newcapacity;
  }
}

压栈STPush

void STPush(ST* pst, STDatatype x)
{
  assert(pst);
  Createcapacity(pst);
  pst->a[pst->top] = x;
  pst->top++;
}

出栈STPop

void STPop(ST* pst)
{
  assert(pst);
  assert(pst->top > 0);
  pst->top--;
}

栈顶元素STTop

STDatatype STTop(ST* pst)
{
  assert(pst);
  assert(pst->top > 0);
  return pst->a[pst->top-1];
}

判断栈是否为空STempty

bool STempty(ST* pst)
{
  assert(pst);
  return pst->top == 0;//为0就是true 为!=0就是为flase
}

栈内元素个数STSize

int STSize(ST* pst)
{
  assert(pst);
  return pst->top;
}

数组栈空间释放STDestroy

void STDestroy(ST* pst)
{
  assert(pst);
  free(pst->a);
  pst->a = NULL;
  pst->top = 0;
  pst->capacity = 0;
}

数组栈总代码

//Test.c
#include"Stack.h"
int main()
{
  ST pst;
  STInit(&pst);
  STPush(&pst, 1);
  STPush(&pst, 2);
  STPush(&pst, 3);
  STPush(&pst, 4);
  STPush(&pst, 5);
  while (!STempty(&pst))
  {
    printf("%d ", STTop(&pst));
    STPop(&pst);
  }
  STDestroy(&pst);
}
//Stack.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int STDatatype;
typedef struct Stack
{
  STDatatype* a;
  int top;
  int capacity;
}ST;
void STInit(ST* pst);
void STDestroy(ST* pst);
void STPush(ST* pst, STDatatype x);
void STPop(ST* pst);
STDatatype STTop(ST* pst);
bool STempty(ST* pst);
int STSize(ST* pst);
//Stack.c
#include"Stack.h"
void STInit(ST* pst)
{
  assert(pst);
  pst->a = 0;
  pst->top = 0;
  pst->capacity = 0;
}
void Createcapacity(ST* pst)
{
  //扩容
  if (pst->top == pst->capacity)
  {
    int newcapacity = pst->capacity == 0 ? 4 : 2 * pst->capacity;
    ST* tmp = (ST*)realloc(pst->a, sizeof(ST) * newcapacity);
    if (tmp == NULL)
    {
      perror("realloc fail");
      return;
    }
    pst->a = tmp;
    pst->capacity = newcapacity;
  }
}
void STPush(ST* pst, STDatatype x)
{
  assert(pst);
  Createcapacity(pst);
  pst->a[pst->top] = x;
  pst->top++;
}
void STPop(ST* pst)
{
  assert(pst);
  assert(pst->top > 0);
  pst->top--;
}
STDatatype STTop(ST* pst)
{
  assert(pst);
  assert(pst->top > 0);
  return pst->a[pst->top-1];
}
bool STempty(ST* pst)
{
  assert(pst);
  return pst->top == 0;//为0就是true 为!=0就是为flase
}
int STSize(ST* pst)
{
  assert(pst);
  return pst->top;
}
void STDestroy(ST* pst)
{
  assert(pst);
  free(pst->a);
  pst->a = NULL;
  pst->top = 0;
  pst->capacity = 0;
}

✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正!各位小伙伴乖乖敲代码哦。

代码---------→【唐棣棣 (TSQXG) - Gitee.com

联系---------→【邮箱:2784139418@qq.com】

目录
相关文章
|
2月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
230 9
|
2月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
37 1
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
68 5
|
2月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
60 4
|
2月前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
2月前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
54 4
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
53 0
|
3月前
数据结构(栈与列队)
数据结构(栈与列队)
25 1