栈的特性及代码实现(C语言)

news2024/11/26 6:55:03

目录

栈的定义

栈的结构选取

链式储存结构和顺序栈储存结构的差异

栈的代码实现

"stack.h"

"stack.c"

总结


栈的定义

栈:栈是限定仅在表尾进行插入和删除操作的线性表。

我们把运行插入的和删除的一段叫做栈顶(TOP),另一段叫做栈底(BOTTOM),不含任何数据元素的栈称为空栈。栈由称后进先出(Last In Fast Out)的线性表,简称LIFO结构。

栈的插入操作,叫做进栈,也称压栈,入栈。

栈的删除操作,叫做出栈,也叫做弹栈。

首先,我们来举几个比较容易理解的生活中的例子来帮助我们理解栈的特性吧。

        首先,我们可以看到上面的烤串,是不是很有食欲,想想一下,当我们串肉到烤串上的时候,是不是一串一串的把肉穿上去,并将它移到稍微下面一点的位置,我们暂且叫它栈底吧,然后我们会继续的将一块一块的肉串上去,直到串到木签的最上方,我们就称它为栈定吧。这种就是入栈的方式。

        然后,当烤串烤好了的时候,端上桌子的时候,你拿起一串,是不是从最上方开始吃,最后再吃最下方的,这就是出栈的方式。

我们再来看一看枪类武器的弹夹。当我们上子弹的时候,最先上进弹夹的子弹在最下面,最后上进去的子弹在最上面,当我们开枪打出的时候,最上面的子弹先被打出,最下面的子弹会被最后打出,其实这也和我们的栈有一点联系。

我们再来看看,是不是每一个网页的左上角都有一个后退的标识呢,这就和我们的栈有关。

栈的结构选取

当我们来实现栈的时候,可以使用链式储存结构和顺序栈的储存结构来实现。

链式储存结构和顺序栈储存结构的差异

        首先,我们一般不会使用链式储存结构来实现栈,首先我们要明确栈的特性,它只需要从一端入一端出。对比一下顺序栈和链栈,它们入数据出数据的时候再空间复杂度上都是相同的,都是O(1)。对于空间性能来说,顺序栈的空间是固定的,如果空间不够就需要扩容,这样就会导致空间浪费,但它的优点就是定位很方便。但是对于链栈来说,我们需要要求每一个节点都需要有一个指针域,这同时也增加了一些内存的开销,但对于栈的长度无限制。

        如果栈的使用过程中元素变化不可料,有时很小,有时很大,那么最好是使用链栈,反之,如果它的变化在可控范围内,建议使用顺序栈会好一些。

栈的代码实现

"stack.h"

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1

//函数声明 结构体实现
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include "stack.h"

typedef int stdatatype;

typedef struct stack
{
	stdatatype* arr;
	int top;
	int capcity;
}stack;


//初始化栈
void Initstack(stack* st);

//销毁栈
void DestroyStack(stack* st);


//压栈
void Pushstack(stack* st, stdatatype x);

//出栈
void Popstack(stack* st);


//返回栈顶元素
stdatatype Topstack(stack* st);


//栈元素大小
int StackSize(stack* st);


//判断栈是否为空
bool StackEmpty(stack* st);

"stack.c"

#include "stack.h"


//函数实现

//初始化栈
void Initstack(stack* st)
{
	assert(st);


	//默认给4个元素的空间大小
	st->arr = (stdatatype*)malloc(sizeof(stdatatype) * 4);

	if (st->arr == NULL)
	{
		perror("malloc fail");
		//-1表示异常退出
		exit(-1);
	}

	st->capcity = 4;
	//栈顶为有效元素的下一位
	st->top = 0;
}



//销毁栈
void DestroyStack(stack* st)
{	
	assert(st);


	//直接释放掉
	free(st->arr);

	//将指针置空
	st->arr = NULL;

	st->capcity = 0;

	st->top = 0;
}


//压栈
void Pushstack(stack* st, stdatatype x)
{	

	assert(st);

	//需要判断空间是否够用,不够就扩容
	if (st->capcity == st->top)
	{
		stdatatype*tmp= (stdatatype*)realloc(st->arr, sizeof(stdatatype) * 2 * st->capcity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			//-1表示异常退出
			exit(-1);
		}
		st->arr = tmp;
		st->capcity *= 2;
	}

	//直接栈顶插入,然后top++
	st->arr[st->top] = x;
	st->top++;
}


//出栈
void Popstack(stack* st)
{
	assert(st);

	assert(st->top > 0);

	//直接top--

	st->top--;

}

//返回栈顶元素
stdatatype Topstack(stack* st)
{	
	assert(st);

	assert(st->top > 0);

	return st->arr[st->top-1];
}


//栈元素大小
int StackSize(stack* st)
{
	assert(st);

	return st->top;
}


//判断栈是否为空
bool StackEmpty(stack* st)
{	
	assert(st);

	//为空top=0 f
	return	st->top == 0;
}


总结

        栈是一种比较特殊的结构,它的特性就是先入后出,后入先出,它的主要应用是在递归中。最后送同学们一些话。

        人生,就像是一个很大的栈演变。出生时你赤条条地来到人世,慢慢地长大,渐渐地变老,最终还得赤条条地离开人世间。

        人生,更需要有进栈出栈的精神体现。在哪里跌倒,就应该在哪里爬起来。无论陷入何等的困境,只要抬头能仰望蓝天,就有希望,不断进取,你就可以让出头之日重现。困难不会永远存在,强者才能勇往直前。

        希望我上面分享的对于栈的理解对大家有所帮助。

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

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

相关文章

坦克飞机大战项目详解:从包结构到测试发布

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、项目初始化与包结构构建 代码案例&#xff1a; 二、资源文件与配置文件管理 代码案例…

Clickhouse 嵌套数据类型总结—— Clickhouse 基础篇(三)

文章目录 创建嵌套类型的表插入读取数据在嵌套类型上使用数组函数 在 clickhouse 中存储嵌套类型的关键字是 Nested, 只支持一级嵌套。数据结构类似于在数据结构类似于在表的单元格里面嵌套“一张表格”&#xff0c;如下图所示&#xff1a; 嵌套类型是列存储&#xff0c;本质…

rv1126 imx307修改驱动使能图像垂直反转180度

查看imx307芯片手册 修改&#xff0c;3007地址的bit0为1 修改imx307驱动代码加入这一句代码&#xff0c;直接写死&#xff0c;这样拍出来的照片就使垂直翻转180度的了 // SPDX-License-Identifier: GPL-2.0 /** imx307 driver** Copyright (C) 2020 Rockchip Electronics Co.…

Elasticsearch 认证模拟题 - 1

1、题目 定义一个数据流&#xff0c;满足 data-stream_*_*&#xff0c;数据首先分布在 data_hot&#xff0c;5分钟后移动到 data_warm&#xff0c;3分钟后到 data_cold&#xff0c;再过 8 分钟删除。 1.1 考点 生命周期索引模板数据流 1.2 答案 # 修改生命周期策略修改时间…

SpringBoot整合RabbitMQ的快速使用教程

目录 一、引入依赖 二、配置rabbitmq的连接信息等 1、生产者配置 2、消费者配置 三、设置消息转换器 四、生产者代码示例 1、配置交换机和队列信息 2、生产消息代码 五、消费者代码示例 1、消费层代码 2、业务层代码 在分布式系统中&#xff0c;消息队列是一种重要…

RTOS(6)任务

重点&#xff1a; 一、FreeRtos任务的API调用 1.创建任务&#xff08;静态、动态创建&#xff09; 动态创建: ①先写任务函数 ②定义函数的handle指针 ③调用动态创建任务的API&#xff1a;xTaskCreate&#xff08;任务函数&#xff0c;任务名称&#xff0c;栈深度&#x…

【css3】01-css3新特性样式篇

目录 1 背景 1.1 设置背景图片的定位 1.2 背景裁切-规定背景的绘制区域 1.3 设置背景图片尺寸 2 边框 2.1 盒子阴影box-shadow 2.2 边框图片border-image 3 文本 -文字阴影text-shadow 1 背景 1.1 设置背景图片的定位 background-origin&#xff1a;规定背景图片的定位…

遇到了导师放养,该怎么坚持?

最近收到学生读者的留言&#xff0c;抱怨科研的困难。导师忙碌且学生众多&#xff0c;自己只是众多学生之一&#xff0c;常常处于放养状态。除了每周的组会外&#xff0c;几乎无法接触到导师。在这种状态下&#xff0c;缺乏方向和动力&#xff0c;非常担心无法顺利毕业&#xf…

Llama模型家族之使用 Supervised Fine-Tuning(SFT)微调预训练Llama 3 语言模型(三)通过web页面方式微调

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

【Linux】自己实现一个bash进程

bash就是命令行解释器&#xff0c;就是Linux操作系统让我们看到的&#xff0c;与用户进行交互的一种外壳&#xff08;shell&#xff09;&#xff0c;当然了bash也是一个进程&#xff0c;它有时候就是通过创建子进程来执行我们输入的命令的。这无疑就离不开我们上篇博客所说的进…

如何解决链游中可能出现的延迟或网络拥堵问题?

随着区块链技术的不断发展和普及&#xff0c;链游&#xff08;基于区块链的游戏&#xff09;作为新兴的娱乐形式&#xff0c;正逐渐走进大众的视野。然而&#xff0c;与传统游戏相比&#xff0c;链游在运行过程中可能会遇到一些特有的问题&#xff0c;其中最为突出的就是延迟和…

Windows hook介绍与代码演示

Windows Hook 是一种机制&#xff0c;允许应用程序监视系统或处理特定事件。它可以拦截和更改消息&#xff0c;甚至可以插入到其他应用程序的消息处理机制中。Windows 提供了多种挂钩类型&#xff0c;例如键盘挂钩、鼠标挂钩、消息挂钩等。 hook代码实现 下面是一个使用 Wind…

微服务架构下的‘黑带’安全大师:Spring Cloud Security全攻略!

深入探讨了微服务间的安全通信、安全策略设计以及面对经典安全问题的应对策略。无论你是微服务的新手还是资深开发者&#xff0c;都能在本文中找到提升安全功力的秘籍。让我们一起成为微服务架构下的‘黑带’安全大师&#xff01; 文章目录 1. 引言微服务安全挑战与重要性Sprin…

【软件工程】【23.04】p1

关键字&#xff1a; 软件模型、提炼、加工表达工具、通信内聚、访问依赖、边界类交互分析、RUP核心工作流、首先测试数据流、软件验证过程、CMMI过程域分类工程类&#xff1b; 软件工程目的、功能需求是需求的主体、结构化方法、耦合、详细设计工具、类、类图、RUP采用用例技…

rk3568_mutex

文章目录 前言1、什么是mutex?1.1mutex互斥体API函数二、实验2.1实验目的2.2源码2.3结果图前言 本文记录的是rk3568开发板基础上做的mutex实验 1、什么是mutex? mutex是互斥体,它是比信号量semaphore更加专业的机制。 在我们编写Linux驱动的时候遇到需要互斥的地方建议使用…

Nginx企业级负载均衡:技术详解系列(12)—— 深入解析root、alias及location

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 在生产服务器的Nginx配置中&#xff0c;我们总会遇到形形色色的配置方案。你是否曾注意到root和alias指令的巧妙应用&#xff1f;是否对那些五花八门的location匹配规则感到好奇&#xff1f; 今天&#xff0c;咱们来聊…

微服务架构-分支微服务设计模式

微服务架构-分支微服务设计模式 这种模式是聚合器模式的扩展&#xff0c;允许同时调用两个微服务链 分支微服务设计模式是一种用于构建大型系统的微服务架构模式&#xff0c;其核心思想是 将复杂的业务逻辑拆解为多个小的、相互独立的子系统&#xff0c;每个子系统由一个或多…

家政项目day2 需求分析(模拟入职后熟悉业务流程)

目录 1 项目主体介绍1.1 项目背景1.2 运营模式1.3 项目业务流程 2 运营端需求2.1 服务类型管理2.2 服务项目&#xff08;服务&#xff09;管理2.3 区域管理2.4 区域服务管理2.5 相关数据库表的管理2.6 设计工程结构2.7 测试接口&#xff08;接口断点查看业务代码&#xff09; 1…

SQL学习小记(三)

SQL学习小记&#xff08;三&#xff09; 功能实现思路代码部分名词解释 代码打包为可执行文件 功能说明&#xff1a;使用python代码&#xff0c;将数据库database1中的表格table1同步到数据库database2中 功能实现 思路 #mermaid-svg-R1pWrEWA799M299a {font-family:"tre…

Redis 中 List 数据结构详解

目录 List 用法 1. 增 2. 删 3. 查 内部编码 应用场景 前言 Redis 中的 List 和 Set 数据结构各有特点&#xff0c;适用于不同的应用场景。List 提供了有序的列表结构&#xff0c;适合用于消息队列和任务列表等场景&#xff1b;Set 提供了无序且不重复的集合结构&#…