追梦之旅【数据结构篇】——详解C语言实现动态版顺序栈

简介: 哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,手把手带领大家详解C语言动态实现顺序栈~ 要是为了运用所学的链表的相关知识和算法。用代码来实现顺序栈,也就是用数组来实现栈。都是精华内容,可不要错过哟!!!😍😍😍

微信图片_20230427214238.gif

😎博客昵称:博客小梦

😊最喜欢的座右铭:全神贯注的上吧!!!

😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘


微信图片_20230427160707.gif


前言🙌



   哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,手把手带领大家详解C语言动态实现顺序栈~ 要是为了运用所学的链表的相关知识和算法。用代码来实现顺序栈,也就是用数组来实现栈。都是精华内容,可不要错过哟!!!😍😍😍


预备小知识💞


栈的概念及结构


微信图片_20230427214412.png


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

称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

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

出栈:栈的删除操作叫做出栈。出数据也在栈顶。


整体实现内容分析💞


栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。顺序栈的设计思想是用数组,相比于静态数组,动态数组来设计的话会更加灵活一点。然后还是和链表那样实现栈的基本功能,这里就不赘述了。


1.头文件编码实现🙌


头文件的编写的整体思路分析:


其实大致的实现和链栈差不多,这里先定义一个栈的结构体,用typedef给结构体和数据类型取别名,然后就是各种功能函数的声明,和上述链表差不多。

#include<stdio.h>
#include<assert.h>
#include<stdbool.h>#include<stdlib.h>
typedef int StDatetype;
typedef struct StackNode
{
    StDatetype* a;
    StDatetype top;
    StDatetype capacity;
}ST;
//初始化
void StackInit(ST*ps);
//销毁
void StackDestory(ST* ps);
//入栈
void StackPush(ST* ps, StDatetype x);
//出栈
void StackPop(ST* ps);
//栈上的数据个数
int  StackSize(ST* ps);
//栈顶元素
StDatetype StackTop(ST* ps);
bool StackEmpty(ST*ps);
void StackPrint(ST* ps);


2.功能文件编码实现🙌


功能文件的编写的整体思路分析:


这里是功能函数的实现,需要注意的地方和编写的算法和链栈实现差不多。只是用数组实现的话,在扩容上不够灵活,会产生空间浪费的问题。为了减少空间浪费,这里采用动态数组,扩容时采用增加2倍,比较合理的申请空间。然后就是要通过画图,来帮助自己理清指针的指向,需要注意的是free掉指针后一定要将指针置为NULL,不然会造成野指针的问题。

#include"Stack.h"
//初始化
void StackInit(ST* ps)
{
  assert(ps);
  ps->a = NULL;
  ps->capacity = 0;
  ps->top = 0;
}
//销毁
void StackDestory(ST* ps)
{
  assert(ps);
  free(ps->a);
  ps->a = NULL;
  ps->capacity = ps->top = 0;
}
//入栈
void StackPush(ST* ps, StDatetype x)
{
  assert(ps);
  if (ps->top == ps->capacity)
  {
    StDatetype newnode = ps->capacity == 0 ? 4 : ps->capacity * 2;
    StDatetype* temp = (StDatetype*)realloc(ps->a, sizeof(StDatetype)*newnode);
    if (temp == NULL)
    {
      printf("realloc fail\n");
      exit(-1);
    }
    ps->a = temp;
    ps->capacity = newnode;
  }
    ps->a[ps->top] = x;
    ps->top++;
}
//出栈
void StackPop(ST* ps)
{
  assert(ps);
  assert(!StackEmpty(ps));
  ps->top--;
}
//栈上的数据个数
int  StackSize(ST* ps)
{  
  assert(ps);
  return ps->top;
}
//栈顶元素
StDatetype StackTop(ST* ps)
{
  assert(ps);
  assert(!StackEmpty(ps));
  return ps->a[ps->top - 1];
}
bool StackEmpty(ST* ps)
{
  return ps->top == 0;
}
void StackPrint(ST* ps)
{
  while (!StackEmpty(&ps))
  {
    printf("%d", StackTop(&ps));
    StackPop(&ps);
  }
  printf("\n");
}


3.测试文件的编写:🙌


#include"Stack.h"
void StackTest()
{
  ST st;
  StackInit(&st);
  StackPush(&st, 1);
  StackPush(&st, 2);
  StackPush(&st, 3);
  StackPush(&st, 4);
  printf("栈的输出\n");
  while (!StackEmpty(&st))
  {
    printf("%d", StackTop(&st));
    StackPop(&st);
  }
  StackDestory(&st);
}
int main()
{
  StackTest();
  return 0;
}


功能测试结果展示图:

微信图片_20230427214832.png


总结撒花💞


   本篇文章旨在分享详解C语言实现动态版顺序栈。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

相关文章
|
6天前
|
存储 Java 容器
深入浅出 栈和队列(附加循环队列、双端队列)
深入浅出 栈和队列(附加循环队列、双端队列)
TU^
|
11天前
|
存储 调度 索引
数据结构~~栈和队列
在计算机科学中,数据结构是构建高效程序的基础。栈和队列是两种重要且常用的线性数据结构,它们在解决各种问题中发挥着关键作用。
TU^
24 1
|
3天前
|
算法 编译器 Python
栈的最后表演:逆波兰表达式求值
栈的最后表演:逆波兰表达式求值
|
7天前
<数据结构>栈和队列. 顺序表实现栈,单链表实现队列.
<数据结构>栈和队列. 顺序表实现栈,单链表实现队列
17 3
|
7天前
|
存储 测试技术 计算机视觉
栈和队列经典练习题
栈和队列经典练习题
17 3
|
7天前
|
C++
数据结构深入理解--栈
数据结构深入理解--栈
16 0
|
7天前
|
存储 C语言
数据结构——顺序表(C语言)
数据结构——顺序表(C语言)
12 1
|
7天前
|
Java 索引
Java数据结构——栈
Java数据结构——栈
19 1