[C语言实现]数据结构——手撕顺序栈之我出生就会写一个栈

news/2024/10/15 13:57:27/


🥰作者: FlashRider

🌏专栏: 数据结构


目录

栈的前置知识

1.什么是栈?

2.生活中哪些地方有栈的影子?

顺序表实现栈

1.为什么通常采用顺序表实现栈?

2.栈的实现



栈的前置知识

1.什么是栈?

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

总的来说,栈就是一个线性表,只不过只能从栈顶入栈,也只能从栈顶出栈,因此栈有一个非常重要的特性——后进先出(First In Last Out)。

2.生活中哪些地方有栈的影子?

让我们来看看下面这段代码:

void f()
{printf("666\n");
}
int main()
{printf("777\n");f();return 0;
}

程序的入口是main函数, 然后执行了printf函数,printf函数结束,然后执行f()函数,在f()函数中执行了第二个printf函数,然后第二个printf函数结束,随后f()函数结束,最后才是main函数结束。

我们可以发现,作为程序入口的main反而是最后结束的,而越后执行的函数越先结束,这就是栈的后进先出特性。所以函数就是利用栈来实现调用的。

 然后printf   f()    main再依次出栈,程序结束。


顺序表实现栈

1.为什么通常采用顺序表实现栈?

我们可以发现,对栈进行插入和删除操作时,永远是在栈顶进行操作,我们把栈顺时针旋转90°,
就变成了只在表尾插入删除的线性表,因为不会大量挪动元素,所以我们选择顺序表实现。

2.栈的实现

头文件 Stack.h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
typedef int STDataType;
typedef struct Stack
{STDataType* a;//存放数据的空间首地址int capacity;//当前栈最大容量int top;//模拟栈顶指针
}ST;
//初始化栈
void StackInit(ST* ps);
//销毁栈 
void StackDestroy(ST* ps);
//插入
void StackPush(ST* ps, STDataType x);
//弹出 
void StackPop(ST* ps);
//获取栈顶元素
STDataType GetTop(ST* ps);
//获取栈当前元素个数
int StackSize(ST* ps);
//判断栈是否为空
bool StackEmpty(ST* ps);

源文件 Stack.c 

//初始化栈
void StackInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = ps->top = 0; 
}
//销毁栈 
void StackDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = ps->top = 0;
}
//插入
void StackPush(ST* ps, STDataType x)
{assert(ps);//判满 if(ps->capacity == ps->top){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);if(tmp == NULL){printf("malloc fail\n");exit(-1);}ps->a = tmp;ps->capacity = newcapacity;}//插入元素 ps->a[ps->top++] = x;
}
//弹出 
void StackPop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));ps->top--;
}
//获取栈顶元素
STDataType GetTop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));return ps->a[ps->top - 1];
}
//获取栈当前元素个数
int StackSize(ST* ps)
{assert(ps);return ps->top;
}
//判断栈是否为空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

测试一下写出来的栈是否可用

源文件 test.c

int main()
{Stack st;StackInit(&st);StackPush(&st, 1);	StackPush(&st, 2);StackPush(&st, 3);StackPush(&st, 4);StackPush(&st, 5);while(!StackEmpty(&st)){printf("%d ", GetTop(&st));StackPop(&st);}return 0;
}

结果:


 


http://www.ppmy.cn/news/297923.html

相关文章

Airtest自动化测试工具实战演练

一开始知道Airtest大概是在年初的时候&#xff0c;当时&#xff0c;看了一下官方的文档&#xff0c;大概是类似Sikuli的一个工具&#xff0c;主要用来做游戏自动化的&#xff0c;通过截图的方式用来解决游戏自动化测试的难题。最近&#xff0c;移动端测试的同事尝试用它的poco库…

学院课程功能使用说明书

引子 越来越多的讲师入驻csdn&#xff0c;也有很多学员通过学院平台进行课程学习&#xff0c;我们收到越来越多用户的反馈&#xff0c;现在通过本帖子来对课程功能做一个介绍&#xff0c;简称课程功能使用说明书1.0版&#xff0c;有任何问题均可在帖子下留言。 讲师 如何成为…

A3C的算法原理和算法流程

在强化学习(十四) Actor-Critic中&#xff0c;我们讨论了Actor-Critic的算法流程&#xff0c;但是由于普通的Actor-Critic算法难以收敛&#xff0c;需要一些其他的优化。而Asynchronous Advantage Actor-critic(以下简称A3C)就是其中比较好的优化算法。本文我们讨论A3C的算法原…

强化学习算法学习汇总笔记 (二) — Actor Critic、DDPG、A3C、

文章目录 一. Actor Critic二. Deep Deterministic Policy Gradient (DDPG)三. Asynchronous Advantage Actor-Critic (A3C) 一. Actor Critic 1.基本概念 Actor Critic 为类似于Policy Gradient 和 Q-Learning 等以值为基础的算法的组合。 a. 其中Actor 类似于Policy Gradie…

强化学习之AC、A2C和A3C

阅读本文可参考我以前的文章《强化学习实践教学》https://tianjuewudi.gitee.io/2021/07/16/qiang-hua-xue-xi-shi-jian-jiao-xue/#toc-heading-29&#xff0c;其中的连续动作空间上求解RL章节是本文的基础&#xff0c;其中的DDPG和Actor-Critic除了Target网络外其余都一致。 …

深度强化学习系列(14): A3C算法原理及Tensorflow实现

在DQN、DDPG算法中均用到了一个非常重要的思想经验回放&#xff0c;而使用经验回放的一个重要原因就是打乱数据之间的相关性&#xff0c;使得强化学习的序列满足独立同分布。 本文首先从Google于ICML2016顶会上发的论文《Asynchronous Methods for Deep Reinforcement Learnin…

Android 热修复方案--阿里百川HotFix

概述 我们都知道一旦我们的应用被发布到各大平台上面之后修复bug是一件很麻烦的事情,如果要重新发布审核周期之长&#xff0c;用户肯定不接受&#xff0c;虽然也可以在应用中自检更新&#xff0c;但是一个小小的bug动辄就更新应用实在是大材小用&#xff0c;但是不更新用户怎么…