【数据结构】栈的基本概念以及C语言代码实现 | 顺序栈 | 链栈

《RT-DETR魔术师》专栏介绍 & 优快云独家改进创新实战 & 专栏目录 通过本专栏的阅读,后续你也可以自己魔改网络,在网络不同位置(Backbone、head、neck、loss等)进行魔改,实现创新!!! 阅读详情

栈和队列

栈和队列都属于线性表

属于"一对一"逻辑关系

栈:“先进后出”

队列:“先进先出”

一 栈

一.什么是栈

看图理解(概念只是辅助理解_理解了才算学会)

在这里插入图片描述

  1. 栈只能从一端存取,另一端是封闭的

  2. 在栈中,无论是存还是取,都必须遵循"先进后出原则"

    ==>栈是一种只能从表的一端存取数据,且遵循"先进后出"原则的线性存储结构

    进栈和出栈

    进栈:将数据存储到站里面

    出栈:将数据从栈中间取出

    栈的实现方法

    栈:"特殊"的线性存储结构

    1 顺序表 ==> 顺序栈(顺序存储结构)

    2 链表 ==> 链栈(链式存储结构)

    栈的应用

    例: 撤销,返回功能 …等等

二.顺序栈

在这里插入图片描述

入栈:

// **元素入栈
// 参数:   存储结构, 栈顶指针, 数据
// 返回值: 栈顶指针(需要知道结束入栈之后栈顶的位置)
int pushElem(int* arr, int top, int val)
{
	arr[++top] = val;  // 初始为-1 数组越界,先移动top位置,后添加数值
	printf("元素%d入栈\n", val);
	return top;
}

出栈:

// **元素出栈
// 参数:   存储结构, 栈顶指针
// 返回值: 栈顶指针
int popElem(int* arr, int top)
{
	// 判断
	if (top <= -1)
	{
		printf("空栈!\n");
		return -1;
	}
	printf("元素%d出栈\n",arr[top]);
	top--;    // 向前移动,但原来的数据还在,无需清除,在添加新元素的时候将它替换
	return top;
}

完整代码+测试:

#include<stdio.h>

// **元素入栈
// 参数:   存储结构, 栈顶指针, 数据
// 返回值: 栈顶指针(需要知道结束入栈之后栈顶的位置)
int pushElem(int* arr, int top, int val)
{
	arr[++top] = val;  // 初始为-1 数组越界,先移动top位置,后添加数值
	printf("元素%d入栈\n", val);
	return top;
}

// **元素出栈
// 参数:   存储结构, 栈顶指针
// 返回值: 栈顶指针
int popElem(int* arr, int top)
{
	// 判断
	if (top <= -1)
	{
		printf("空栈!\n");
		return -1;
	}
	printf("元素%d出栈\n",arr[top]);
	top--;    // 向前移动,但原来的数据还在,无需清除,在添加新元素的时候将它替换
	return top;
}


int main()
{
	// 数组
	int arr[100];
	// top指针(下标)
	int top = -1;
	//入栈
	top = pushElem(arr, top, 1);  //函数返回新的top值赋给top
	top = pushElem(arr, top, 2);
	top = pushElem(arr, top, 3);
	top = pushElem(arr, top, 4);
	top = pushElem(arr, top, 5);
	//出栈
	top = popElem(arr, top);
	top = popElem(arr, top);
	top = popElem(arr, top);
	top = popElem(arr, top);
	top = popElem(arr, top);
	top = popElem(arr, top);
}


// **元素入栈
// 参数:   存储结构, 栈顶指针, 数据
// 返回值: 栈顶指针(需要知道结束入栈之后栈顶的位置)
int pushElem(int* arr, int top, int val);


// **元素出栈
// 参数:   存储结构, 栈顶指针
// 返回值: 栈顶指针
int popElem(int* arr, int top);

在这里插入图片描述

三.链栈

一般将链表的头部作为栈顶

入栈:

// **添加元素
// 参数: 头指针,数据
// 返回值: 头指针
Node* pushElement(Node* stack, int Data) {
	// 1 申请内存
	Node* NewNode = (Node*)malloc(sizeof(Node));
	// 2 初始化节点
	NewNode->data = Data;
	// 3 新的节点作为新的头节点
	NewNode->pnext = stack;
	// 4 头指针指向新的头节点
	stack = NewNode;
	// 5 返回头指针
	return stack;
}

出栈:

// **删除元素
// 参数: 头指针
// 返回值: 头指针
Node* popElement(Node* stack) {
	// 1 判断是否为空栈
	if (stack)
	{
		// 临时指针 保存栈顶(头指针)
		Node* p = stack;
		// 头指针后移
		stack = stack->pnext;  // 与顺序栈一样,无需清除,在添加新元素的时候将它替换
		// 打印数据
		printf("原来栈顶元素:%d  ",p->data);
		// 再次判断是否到了栈顶底部
		if (stack)
		{
			printf("当前栈顶元素:%d\n",stack->data);
		}
		else
		{
			printf("栈顶已经空了!\n");
		}
		// 释放节点
		free(p);
	}
	else
	{
		printf("是一个空栈!\n");
	}
	return stack;
}

完整代码+效果展示

#include<stdio.h>
#include<stdlib.h>

// 节点
typedef struct Node {
	int data;
	struct Node* pnext;
}Node;

// **添加元素
// 参数: 头指针,数据
// 返回值: 头指针
Node* pushElement(Node* stack, int Data) {
	// 1 申请内存
	Node* NewNode = (Node*)malloc(sizeof(Node));
	// 2 初始化节点
	NewNode->data = Data;
	// 3 新的节点作为新的头节点
	NewNode->pnext = stack;
	// 4 头指针指向新的头节点
	stack = NewNode;
	// 5 返回头指针
	return stack;
}


// **删除元素
// 参数: 头指针
// 返回值: 头指针
Node* popElement(Node* stack) {
	// 1 判断是否为空栈
	if (stack)
	{
		// 临时指针 保存栈顶(头指针)
		Node* p = stack;
		// 头指针后移
		stack = stack->pnext;  // 与顺序栈一样,无需清除,在添加新元素的时候将它替换
		// 打印数据
		printf("原来栈顶元素:%d  ",p->data);
		// 再次判断是否到了栈顶底部
		if (stack)
		{
			printf("当前栈顶元素:%d\n",stack->data);
		}
		else
		{
			printf("栈顶已经空了!\n");
		}
		// 释放节点
		free(p);
	}
	else
	{
		printf("是一个空栈!\n");
	}
	return stack;
}

int main()
{
	Node* p = NULL;
	// 入栈
	for (int i = 0; i < 10; i++)
	{
		p = pushElement(p, i);
	}
	// 出栈
	for (int i = 0; i < 11; i++)
	{
		p = popElement(p);
	}
}
SimpleITK使用——1. 进行Resample/Resize操作 文章目录1. 变换到一个新的spacing1.1 使用Resample()的方法1.1.1 完整代码1.1.2 转换前后图像1.2 使用ResampleImageFilter()的方法2. 已知原图和变换后目标图像的大小2.1 代码2.2 转换后图像3. 相关内容说明3.0 体素和spacing3.1 Resample() 函数说明3.2 itk::simple::ResampleImageFilter函数说明 1. 变换到一个新的spacing 1.1 使用Resample()的方法 1.1.1 阅读详情

相关推荐

凌欧通用FOC框架解析(5.程序环流程)

结构体:电流内环.这是一个结构体函数占空比13.

weixin_43756295的博客 2935

线性结构-栈

文章目录栈和队列一 栈一.什么是栈进栈和出栈栈的实现方法栈的应用二.顺序栈三.链栈 栈和队列 栈和队列都属于线性表 属于"一对一"逻辑关系 栈:“先进后出” 队列:“先进先出” 一 栈 一.什么是栈 看图理解(概念只是辅助理解_理解了才算学会) 栈只能从一端存取,另一端是封闭的 在栈中,无论是存还是取,都必须遵循"先进后出原则" ==>栈是一种只能从表的一端存取数据,且遵循"先进后出"原则的线性存储结构 进栈和出栈 进栈:将数据存储到站里面 出栈:将数据从栈中间取出 栈的实现方法 栈:"特殊

zhuiyizhifengfu的博客 360

PRD撰写效率翻倍秘籍:我是如何用大模型+飞书文档搭建自动化工作流的

本文分享了如何利用大模型与飞书文档构建自动化工作流,以大幅提升PRD撰写效率。通过结构化需求输入、设计模块化提示词模板,并借助自动化脚本桥接数据与文档,产品经理可将繁琐的文档撰写工作自动化,从而将精力聚焦于产品战略与用户洞察。

weixin_28520495的博客 405

【数据结构】栈的定义与实现(附完整运行代码)

栈的定义,顺序栈链栈的比较,栈的实现

2301_79633555的博客 2778

别再手动续期SSL证书了!用acme.sh配合阿里云DNS API,实现全自动HTTPS证书管理

本文详细介绍了如何使用acme.sh配合阿里云DNS API实现SSL/TLS证书的全自动管理,彻底解决手动续期带来的风险与不便。通过自动化部署流程,包括环境准备、API集成、多域名证书申请等关键步骤,帮助运维人员构建高效、可靠的HTTPS证书管理体系,显著提升安全性和运维效率。

weixin_29200485的博客 271

用Java实现对接豆包ai火山引擎详细版简单明了ai对话

第二部分代码实现。

m0_72637700的博客 8609

栈(stack)入门详解之C语言版

栈(Stack):是一种受限的线性表,即限制在表的一端进行插入和删除操作。栈也称为后进先出LIFO (Last In First Out)或先进后出FILO (First In Last Out)线性表。 栈顶(top):允许进行插入、删除操作的一端称为栈的栈顶(top),也称为表尾。 栈底(bottom):固定不动的一端,称为栈底(bottom),也称为表头。

sunnyoldboy博客 8233

图形学基础|基于SDF的卡通阴影图

图形学基础|基于SDF的卡通阴影图 文章目录图形学基础|基于SDF的卡通阴影图一、前言二、SDF(Signed Distance Field)三、阴影图生成3.1 SDF生成3.2 插值参考博文 一、前言 回顾之前做的卡通渲染,角色面部阴影是靠一张阴影贴图实现的。 为了更好地控制角色的脸部阴影,通过计算脸部朝向与光照方向的夹角和一张单色的FaceMap来判断。 FaceMap的每个像素表示:该像素判断为阴影时候需要达到的夹角。 例如: 当方向光正对角色的时候,夹角为0°,对应的值为0,此时,FaceMap

【黑键】 1万+

顺序栈操作(C语言代码)

顺序栈是一种使用连续存储空间(如数组)来存储栈中元素的栈结构。它具有后进先出(LIFO, Last In First Out)的特性,即最后入栈的元素会首先出栈。

master_hunter的博客 1384

让Claude连续写代码24小时会发生什么?揭秘长时运行”架构背后的工程逻辑与未来

AI长时运行实验揭示软件开发新范式 Claude Opus通过Harness框架24小时独立开发全栈应用的成功实验,展示了AI从辅助工具向异步协作者的进化。实验采用"上下文轮转"机制解决记忆管理难题,将任务拆解为微周期并通过文件系统同步进度。核心突破在于:1)TDD成为AI自治基石,200+测试用例确保开发不偏航;2)文件取代对话成为AI间高效沟通介质;3)开发者角色重构为需求定义和框架设计者。该实验证明,通过严谨的架构约束和验收标准,AI可完成复杂长周期任务,预示着软件开发将从手工作坊

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1094

卷积码Viterbi译码算法原理及C语言实现

具体而言,卷积码的编码过程是将输入数据和编码器中的状态进行异或操作,输出码字为各个状态对应的结果。Viterbi译码算法是一种最大似然译码算法,根据接收到的含有噪声的码字,寻找出最有可能的原始数据序列。(2) 递推计算:根据接收到的码字和当前状态,计算下一时刻各个状态的路径度量,并记录每个状态的前驱状态。以上代码实现了一个简单的卷积码Viterbi译码算法,通过接收到的码字进行译码,并输出解码结果。(1) 初始化:将所有状态的路径度量初始化为一个很大的值,选择路径度量最小的状态作为起始状态。

2301_79331421的博客 826

数据结构之顺序栈的操作(C语言附详细代码与解释)

对数据结构,顺序栈的基本操作的代码与思路解释。

m0_68210771的博客 5714

网格质量评价

CFD中评价网格质量的方法

B_etter_Man的博客 1万+

【数据结构与算法】走进数据结构的“时间胶囊”——栈

栈(Stack)是一种只允许在一端进行插入或删除的线性表。这端被称为栈顶(Top),另一端则被称为栈底(Bottom)。栈遵循后进先出(Last In First Out,LIFO)的原则,即最后插入的元素会第一个被删除。首先,我们定义了一个名为STDataType的类型别名,它基于int类型。这个类型别名将用于栈中存储的数据元素。接着,我们定义了一个名为Stack的结构体(通过typedef,我们也可以用ST来引用它)。arr:这是一个指向STDataType类型的指针。

2401_85548793的博客 1258

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

栈入门:链栈和顺序栈的实现操作讲解(C语言)-基础教程

C语言,数据结构栈,顺序栈和链栈的基础知识详细讲解和实现演示,配有动图展示过程。

Mzyh的博客 1498

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C语言中的栈

1. 栈的定义: 限定仅在表尾进行插入或删除的线性表(后进先出LIFO:Last in , First out)。表头端称为栈底,表尾端称为栈顶。不含元素的空表称为空栈。 2. 栈的建立以及初始化 栈类似于线性表,有两种存储表示方法:顺序栈和链栈。 顺序栈 : 利用一组地址连续的存储单元依次存放字栈底到栈顶的元素,同时附设指针top指示栈顶元素在顺序栈中的位置,top=0为空栈。(栈所需大小难以估计,通常先分派一个基本容量,不够时再追加) 顺序栈的定义:建立一个结构体,包含栈...

m0_63188530的博客 7524

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数据结构C语言版-严蔚敏 笔记及源码(3)顺序栈的表示和实现

栈 栈和线性表相似,栈也有两种存储表示方法。 顺序栈 链栈 栈(Stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应的,表头端称为栈底(bottom)。栈的修改时按后进先出的原则进行的。因此栈又称为后进先出线性表 顺序栈的操作有: InitStack(&S) #栈的初始化 DestortStack(&S) #销毁栈 ClearStack(&S)

SuperYong的博客 586

C语言实现顺序栈 链栈 循环队列 链队列的基本操作

顺序栈 #include <stdio.h> #include <stdlib.h> #define StackInitSize 10 #define StackIncrement 5 typedef int SElemType; typedef struct { SElemType *base; int top; int stacksize; }SqStack; v...

palepale 1162

数据结构学习笔记(栈、队列)整理与总结

数据结构学习笔记(栈、队列)整理与总结栈栈结构之顺序栈的基本介绍顺序栈的常用操作栈结构之链栈的基本介绍链栈的常用操作队列顺序队列链队列三级目录 栈 栈的概念: 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。 结构: 栈结构之顺序栈的基本介绍 概念: 栈是限

weixin_44814867的博客 682

七、数据结构:线性表-栈(后进先出)

1、栈是一种先进后出的顺序表,和顺序表的区别是:顺序表可以操作任意元素,但是栈只能对栈顶元素进行操作,即后进先出原则。 2、栈的操作就只有入栈和出栈两个。 3、实现入栈和出栈 栈的栈顶用top标识,入栈时top加一,出栈时top减一,top为-1时表示栈空。 #include <stdio.h> #define MAX 5 int push(int *a,int top,i...

fanzirong_的博客 1752

数据结构与算法之栈

数据结构与算法之栈 1.栈(Stack)的基本概念 栈是限制仅能在表的一端进行插入和删除操作的线性表。允许插入和删除的一端叫做栈顶,另一端则为栈底。其的特点是后进先出(Last in First Out)。 2.栈的存储结构 栈的顺序存储结构称为顺序栈。顺序栈是利用一组连续的存储单元依次存放元素,通常用一维数组存放栈的元素。栈的顺序结构使用方便,但必须预先分配内存,可能造成存储空间浪费或栈溢出的缺...

鬼谷子的博客 971

数据结构之栈的部分总结

栈 先进后出,(形象的类似为碟盘子,取盘子) 仅允许在栈顶top进行插入、删除操作,另一端不能进行插入、删除操作的称为栈底bottom 顺序栈 # include<stdio.h> # include<stdlib.h> # define MAXSIZE 20; typedef struct{ int a[MAXSIZE]; int top; }SeqStack; ...

qiao_xi的博客 338

C语言-栈

C语言-栈

qq_64831425的博客 423

c语言栈的实现,栈的实现(C语言)

栈的定义栈是一种只能在一端进行插入或删除操作的线性表。运行插入或删除操作的一端称为栈顶,栈的插入和删除一般叫入栈和出栈。栈用顺序存储结构则称为顺序栈,用链式存储结构则称为链栈。特点先进后出,后进先出栈结构以下是个简单的栈结构struct stack{int data[10];int top;};顺序存储结构下面是用顺序存储结构实现的栈源码#include#include#define maxsiz...

weixin_42500195的博客 423

栈的表示和操作

参考书:《数据结构(C语言版|第2版)》严蔚敏 李冬梅 吴伟民 编著 栈是限定仅在表尾进行插入或者删除的线性表。 顺序栈 #include <iostream> #include<stdio.h> #include<stdlib.h> #include<assert.h> using namespace std; typedef int...

qq_43697167的博客 317

数据结构之栈和队列

栈和队列 栈和队列的基本概念 1. 栈的基本概念 1.1 栈的定义   栈是一种只能在一端进行插入或者删除操作的线性表。其中允许进行插入或删除操作的一端称为栈顶(TOP)。栈顶由一个叫作栈顶指针来表示,栈的另外一端称之为栈底,栈底是固定不变的。栈的插入和删除操作一般可以称之为入栈出栈。 1.2 栈的特点   主要特点为先进先出(FILO)。 1.3 栈的存储结构   可以用顺序表和链表来存储栈,分为顺序栈和链栈。 1.4 栈的数学性质   当n个元素以某种顺序进栈时,并且可以在任意时刻出栈,所获得的排列组合

叫我蘑菇先生 507
上一篇: 【软件工程导论】知识点汇总 | 适用于考试复习 | 轻松通过考试
下一篇: JeecgBoot 使用心得
MuShan-bit
博客等级 码龄5年 538粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MuShan-bit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值