线性表--栈

news2024/9/27 2:51:49

1.什么是栈?

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除
操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。

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

后进先出

 2.动态栈的实现

栈可以用前面章节介绍的数组或者链表的节点实现,数组相比之下更优越一下,动态开辟内存实现扩容,且在数组尾上插入数据代价较小(链表节点还得创建next指针)。

 2.1栈的形式

2.2初始化

 2.3入栈

 

 2.4出栈

 直接top-1就行,如果后序入栈会直接覆盖,也不影响后续出栈,调用栈顶等操作,因为这些操作都基于top的数值来进行的。

2.5调用栈顶

 2.6返回有效数据个数

 2.7判断是否为空栈

 2.8销毁

 3.代码

//Stack.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1

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

typedef int StackDataType;
//栈(stack)
typedef struct Stack
{
	StackDataType* arr;//数据
	int capacity;//容量
	int top;//栈顶,top初始化为0,则top为最后一个有效数据的下一位下标;\
	top初始化为-1,则为最后一个有效数据下标
}Stack;

//初始化
void StackInit(Stack* ps);
//销毁
void StackDestroy(Stack* ps);
//入栈
void StackPush(Stack* ps, StackDataType x);
//出栈
void StackPop(Stack* ps);
//调用栈顶
StackDataType StackTop(Stack* ps);
//返回个数
int StackSize(Stack* ps);
//判断是否为空栈
bool StackEmpty(Stack* ps);
//Stack.c


#include "Stack.h"

//初始化
void StackInit(Stack* ps)
{
	assert(ps);
	ps->arr = (StackDataType*)malloc(sizeof(StackDataType) * 4);//初始开辟容量4个
	if (ps->arr == NULL)//开辟失败
	{
		perror("Malloc Fail!");
		exit(1);
	}
	ps->capacity = 4; // 初始开辟容量4个
	ps->top = 0;//top初始化为0,则top为最后一个有效数据的下一位下标
}
//销毁
void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->arr);
	ps->arr = NULL;
	ps->capacity = ps->top = 0;
}
//入栈
void StackPush(Stack* ps, StackDataType x)
{
	assert(ps);
	//需要扩容
	if (ps->top == ps->capacity)
	{
		//扩容为原来2倍
		StackDataType* temp = (StackDataType*)realloc(ps->arr, ps->capacity * 2 * sizeof(StackDataType));
		if (temp == NULL)//扩容失败
		{
			perror("Realloc Fail!");
			exit(1);
		}
		ps->arr = temp;
		ps->capacity = ps->capacity * 2;
	}
	//加入数据
	ps->arr[ps->top] = x;
	ps->top++;
}
//出栈
void StackPop(Stack* ps)
{
	assert(ps);
	//栈为空不能删
	assert(ps->top > 0);
	ps->top--;
}
//调用栈顶
StackDataType StackTop(Stack* ps)
{
	assert(ps);
	//栈为空不能调用
	assert(ps->top > 0);

	return ps->arr[ps->top - 1];
} 
//返回个数
int StackSize(Stack* ps)
{
	assert(ps);

	return ps->top;
}
//判断是否为空栈
bool StackEmpty(Stack* ps)
{
	assert(ps);
	//真为空,假不为空
	return ps->top == 0;
}
//Test.c


#include "Stack.h"

void test1()
{
	Stack ps;
	StackInit(&ps);
	StackPush(&ps, 1);
	StackPush(&ps, 2);
	StackPush(&ps, 3);
	StackPush(&ps, 4);
	StackPush(&ps, 5);
	printf("%d\n", StackSize(&ps));
	while (!StackEmpty(&ps))
	{
		printf("%d ", StackTop(&ps));
		StackPop(&ps);
	}
	printf("\n%d\n", StackSize(&ps));
	StackDestroy(&ps);
}

int main()
{
	test1();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1414709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI大模型开发架构设计(5)——人人能学会的Llama-2大模型微调

文章目录 人人能学会的Llama-2大模型微调1 什么是Llama-2以及关键特性分析什么是Llama-2?Llama-2关键特性分析2 Llama-2微调全流程剖析为什么要微调Llama-2?Llama-2微调全流程3 基于Llama-2微调3个应用案例案例1:电子游戏评价数据生成文本数据集合案例2:利用Llama-2微调模型…

linux 查看zookeeper server运行版本号

zookeeper版本查看运行命令&#xff1a;echo stat|nc localhost 2181 显示如下图所示&#xff1a; Zookeeper version: 3.4.5-cdh6.3.2--1, built on 11/08/2019 13:15 GMT Clients: /127.0.0.1:44814[0](queued0,recved1,sent0) Latency min/avg/max: 0/0/0 Received: 9 Se…

【Linux】开始使用 vim 吧!!!

Linux 1 what is vim &#xff1f;2 vim基本概念3 vim的基本操作 &#xff01;3.1 vim的快捷方式3.1.1 复制与粘贴3.1.2 撤销与剪切3.1.3 字符操作 3.2 vim的光标操作3.3 vim的文件操作 总结Thanks♪(&#xff65;ω&#xff65;)&#xff89;感谢阅读下一篇文章见&#xff01;…

这是一片测试文章

这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 真的是测试文章 -111122225555444433333333222211111 dddddaaa

网络安全B模块(笔记详解)- HASH算法的基本使用

1.通过服务器场景(A-Server),进行HASH算法的基本使用。将123456作为openssl md5 的输入参数,使用 123456进行md5计算并将内容输出到屏幕。将此命令中输出结果的命令作为Flag提交; 2.通过服务器场景使用不同的加密方式对123456进行加密,对比两个加密字符串有何不同。使用…

20240127如何在线识别德语字幕?

20240127如何在线识别德语字幕&#xff1f; 2024/1/27 11:42 1945[科尔贝格]Kolberg 01:48:49 接近109分钟 德语视频的字幕OCR适配&#xff1a; 1、whisper&#xff0c;8:39-8:58&#xff0c;使用GTX1080需要接近20分钟。对整机性能要求比较重&#xff0c;特别吃显卡&#xff…

代码随想录算法刷题训练营day16

代码随想录算法刷题训练营day16&#xff1a;LeetCode(104)二叉树的最大深度 、LeetCode(559)n叉树的最大深度、LeetCode(111)二叉树的最小深度、LeetCode(222)完全二叉树的节点个数 LeetCode(104)二叉树的最大深度 题目 代码 /*** Definition for a binary tree node.* publ…

外包干了10个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

上升子序列的最大长度,递归-记忆化搜索-动态规划三步走

题目描述&#xff1a; 小明有一个数组&#xff0c;他想从数组任意元素开始向后遍历&#xff0c;找出所有上升子序列&#xff0c;并计算出最长的上升子序列的长度。 数据范围&#xff1a; 每组数据长度满足 1≤n≤200 1≤n≤200 &#xff0c; 数据大小满足 1≤val≤350 1≤val≤…

一句话说透redis哨兵模式

提到哨兵模式&#xff0c;不得不从另外一个模式进行说起&#xff0c;那就是redis的最常见的模式 主从模式&#xff0c;那么为啥还需要哨兵模式呢&#xff1f; 是因为如果开启了reids的主从模式&#xff0c;当主有问题时候&#xff0c;需要人工的切换到从节点上&#xff0c;无法…

如何实现无公网IP实现远程访问MongoDB文件数据库

&#x1f4d1;前言 本文主要是如何实现无公网IP实现远程访问MongoDB文件数据库的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x…

免费激活Vmware16且配置虚拟机网络

今天从头配置了一台虚拟机&#xff0c;遇到了点问题&#xff0c;记录一下从头开始的过程&#xff0c;以便下次查看 第一步 下载VM16 链接&#xff1a;https://pan.baidu.com/s/1a2gIXKYMMRXVEHb7bM4stw 提取码&#xff1a;7mht 步骤很简单&#xff0c;安装之后直接把文件夹里…

2024区块链应用最趋势,RWA实物资产化

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 实物资产通证化&#xff0…

设计模式分类

常用的设计模式有哪些&#xff1f; 常用的设计模式通常按照创建型、结构型和行为型三大类别来划分&#xff0c;以下是每个类别中的一些常见设计模式&#xff1a; 创建型&#xff08;Creational Patterns&#xff09;&#xff1a; 单例模式&#xff08;Singleton Pattern&…

openssl3.2 - 测试程序的学习 - test\acvp_test.c

文章目录 openssl3.2 - 测试程序的学习 - test\acvp_test.c概述笔记要单步学习的测试函数备注END openssl3.2 - 测试程序的学习 - test\acvp_test.c 概述 openssl3.2 - 测试程序的学习 将test*.c 收集起来后, 就不准备看makefile和make test的日志参考了. 按照收集的.c, 按照…

二极管漏电流对单片机ad采样偏差的影响

1&#xff0c;下图是常规的单片机采集电压电路&#xff0c;被测量电压经过电阻分压&#xff0c;给到mcu采集&#xff0c;反向二极管起到钳位作用&#xff0c;避免高压打坏mcu。 2&#xff0c;该电路存在的问题 二极管存在漏电流&#xff0c;会在100k电阻上产生叠加电压&#x…

Cybellum—信息安全测试工具

产品概述 由于软件和数据在汽车上的使用越来越多&#xff0c;汽车越来越“智能化”&#xff0c;汽车行业面临着重大的信息安全挑战。2021年8月&#xff0c;ISO/SAE 21434正式发布&#xff0c;标准中对汽车的信息安全提出了规范化的要求&#xff0c;汽车信息安全不容忽视。 Cyb…

什么是数据库的三级模式两级映象?

三级模式两级映象结构图 概念 三级模式 内模式&#xff1a;也称为存储模式&#xff0c;是数据物理结构和存储方式的描述&#xff0c;是数据在数据库内部的表示方式。定义所有的内部记录类型、索引和文件组织方式&#xff0c;以及数据控制方面的细节。模式&#xff1a;又称概念…

GA/T 1400视图库服务平台Easy1400视图库平台发布了,免费下载使用,23年做社会贡献的最后一项完成!

在23年12月开始的时候&#xff0c;立了一个flag&#xff0c;要给社会贡献一款免费可用的GA/T 1400视图库服务平台&#xff0c;原因背景也在《免费的GA/T 1400视图库服务平台》、《GA/T 1400视图库服务平台开发完成了&#xff0c;采集设备接入、人脸/人员/机动车/非机动车图库、…

Final Cut Pro for Mac(fcpx视频剪辑)v10.7.1 中文版

Final Cut Pro是由苹果公司开发的一款专业视频编辑软件&#xff0c;主要用于影片的后期剪辑、调色、特效、音频处理等方面。 软件下载&#xff1a;Final Cut Pro for Mac v10.7.1 中文版 以下是Final Cut Pro的特点&#xff1a; 高效的视频编辑功能&#xff1a;Final Cut Pro提…