[数据结构]栈和队列结构的简单制作

news2025/2/22 6:13:10

一、栈

1.1栈的概念以及结构

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

栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

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

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

1.2栈的实现

栈可以用顺序表或者链表进行实现,但是相对而言顺序表的优势较为大,以下是栈的实现方法,因比较简单所以读者可以自行阅读代码

Stack.h文件

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define datatype int

typedef struct stack
{
	datatype* x;
	int top;
	int capacity;
}stack;

//初始化栈
void stackinit(stack* input);
//进栈
void stackpush(stack* input, datatype y);
//打印栈
void stackprint(stack* input);
//出栈
void stackpop(stack* input);
//检验是否为空

Stack.c文件

#include "stack.h"
//初始化栈
void stackinit(stack* input)
{
	datatype* temp = (datatype*)malloc(sizeof(datatype) * 4);
	if (temp == NULL)
	{
		perror("stackinit:");
	}
	input->x = temp;
	input->capacity = sizeof(datatype) * 4;
	input->top = 0;
}
//进栈
void stackpush(stack* input, datatype y)
{
	if (input->top + 1 == input->capacity)
	{
		datatype* temp = realloc(input->x,(input->capacity) * 2);
		input->capacity *= 2;
		if (temp == NULL)
		{
			perror("stackpush:");
		}
		input->x = temp;
	}
	input->x[input->top] = y;
	input->top++;
}
//打印栈
void stackprint(stack* input)
{
	assert(input);
	int i = input->top-1;
	while (i >= 0)
	{
		printf("%d", input->x[i]);
		i--;
	}
	printf("\n");
}
//出栈
void stackpop(stack* input)
{
	assert(input);
	input->top--;
}

test.c文件

#include "stack.h"

void test1()
{
	stack A;
	stackinit(&A);
	stackpush(&A, 1);
	stackpush(&A, 2);
	stackpush(&A, 3);
	stackpush(&A, 4);
	stackpush(&A, 5);
	stackprint(&A);
	stackpop(&A);
	stackpop(&A);
	stackpop(&A);
	stackprint(&A);
}


void main()
{
	test1();
}

二、队列

2.1队列的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头

2.2队列的实现

同样,队列也是一种很简单的数据结构,读者可以自行阅读代码

Queue.h文件

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define datatype int
typedef struct ListNode
{
	datatype x;
	struct ListNode* next;
}LN;

typedef struct Queue
{
	LN* head;
	LN* tail;
}Queue;
void Queueinit(Queue* input);
void Queuepush(Queue* input,datatype y);
void Queuepop(Queue* input);
void Queueprint(Queue* input);
int Queuesize(Queue* input);

Queue.c文件

#include "Queue.h"
void Queueinit(Queue* input)
{
	input->head = NULL;
	input->tail = NULL;
}
void Queueprint(Queue* input)
{
	assert(input);
	assert(input->head);
	LN* temp = input->head;
	while (temp)
	{
		printf("%d ->", temp->x);
		temp = temp->next;
	}
	printf("NULL\n");
}
void Queuepush(Queue* input, datatype y)
{
	assert(input);
	LN* temp1 = (LN*)malloc(sizeof(LN));
	if (temp1 == NULL)
	{
		perror("Queuepush:");
	}
	temp1->x = y;
	temp1->next = NULL;
	if ((input->head==NULL) && (input->tail==NULL) )
	{
		input->head = input->tail = temp1;
		return;
	}
	input->tail->next = temp1;
	input->tail = input->tail->next;
}
void Queuepop(Queue* input)
{
	assert(input);
	assert(input->head);
	if (input->head == input->tail)
	{
		free(input->head);
		input->head = NULL;
		input->tail = NULL;
		return;
	}
	LN* temp = input->head->next;
	free(input->head);
	input->head = temp;
}
int Queuesize(Queue* input)
{
	int count = 0;
	LN* temp = input->head;
	while (temp)
	{
		temp = temp->next;
		count++;
	}
	return count;
}

test.c文件

#include "Queue.h"

void test1()
{
	Queue A;
	Queueinit(&A);
	Queuepush(&A, 1);
	Queuepush(&A, 4);
	Queuepush(&A, 3);
	Queuepush(&A, 2);
	Queueprint(&A);
	Queuepop(&A);
	Queuepop(&A);
	Queuepop(&A);
	Queuepop(&A);
	Queuepush(&A, 2);
	Queueprint(&A);
	printf("%d",Queuesize(&A));
}


void main()
{
	test1();
}

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

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

相关文章

yolov7的改进工地安全帽佩戴检测系统-协同双注意力机制CDAM2(教程+代码)

研究的背景和意义 随着工业化和城市化的快速发展&#xff0c;建筑工地的安全问题日益凸显。在建筑工地中&#xff0c;工人的安全是至关重要的&#xff0c;而工地安全帽的佩戴是保障工人安全的重要措施之一。然而&#xff0c;由于工地环境复杂多变&#xff0c;工人的佩戴情况往…

网络安全之权限维持那点事

权限维持 一旦黑客成功地入侵了目标系统&#xff0c;他们通常会尝试保持对系统的持久访问权&#xff0c;以便继续执行恶意活动&#xff0c;如窃取敏感数据、植入恶意软件、破坏系统功能等。 权限维持的过程可能包括以下几个方面&#xff1a; 后门植入&#xff1a;黑客可能会在…

蓝桥杯单片机要点——第十二届省赛(含代码)

题目&#xff1a; 用到的模块&#xff1a; LED单个点亮&#xff08;建议用sbit&#xff0c;文件开头定义单个引脚&#xff09; 数码管动态显示 矩阵键盘 ds18b20&#xff0c;用到onewire.c DAC转化&#xff08;步骤见文章末尾的易错点&#xff09;&#xff0c;用到iic.c m…

一本书了解AI的下一个风口:AI Agent

在数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动现代社会前进的强劲引擎。 从智能手机的智能助手到自动驾驶汽车的精准导航&#xff0c;AI技术的应用已经渗透到生活的方方面面。 随着技术的飞速发展&#xff0c;我们正站在一个新的转折点上&#xff…

Playwright安装和基本使用(ui/web自动化)

1.简介 Playwright是2021年微软开源的一个项目「playwright-python」。针对 Python 语言的纯自动化工具&#xff0c;它可以通过单个API自动执行 Chromium&#xff0c;Firefox 和 WebKit 浏览器&#xff0c;同时支持以无头模式、有头模式运行。 Playwright&#xff08;Git&…

美国CPC认证是什么认证

美国CPC认证是一种针对儿童产品的认证&#xff0c;旨在确保这些产品的安全性。CPC全称为Consumer Product Certification&#xff0c;即消费品认证&#xff0c;是美国消费品安全委员会&#xff08;CPSC&#xff09;所推行的一种自愿性认证制度。通过CPC认证的产品&#xff0c;意…

人证比对接口在游戏行业的作用

人证比对接口又叫实人认证接口、人脸身份证比对接口、人脸实名认证接口&#xff0c;这个接口在很多行业都有重大作用&#xff0c;特别是确认当前用户信息至关重要。今天我们来聊一聊实人认证接口在游戏行业的作用。 今天为什么聊这个话题呢&#xff0c;主要就是最近热搜都被杭…

AR远程空间标注Vuforia+WebRTC音视频通话和空间标注功能

AR远程空间标注VuforiaWebRTC音视频通话和空间标注功能 视频学习地址&#xff1a;https://www.bilibili.com/video/BV1ZT4y187mG/?vd_sourcefc4b6cdd80b58c93a280fd74c37aadbf

LeetCode110:平衡二叉树

题目描述 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 解题思想 使用递归依次计算左子树的高度和右子树的高度 代码 class Solution { public:int height(TreeNode* node) {if (node nullptr) return 0;int leftT height(node->left);if (leftT -1) return -1;…

武汉星起航:亚马逊助力中国卖家拓展全球市场,实现品牌价值最大化

亚马逊&#xff0c;作为全球电商的领军平台&#xff0c;不仅为消费者提供了丰富的购物选择&#xff0c;同时也为中国卖家带来了前所未有的益处和在中国市场的巨大优势。 亚马逊为中国卖家提供了一个全球化的销售平台。这个平台不仅连接了中国与世界的消费者&#xff0c;还为中…

标准C库文件操作

open 系列API 和 fopen系列API的区别 1.来源: -open 是UNIX系统调用函数(包括LINUX系统)&#xff0c;返回的是文件描述符 -fopen是ANSIC标准的C语言库函数&#xff0c;在不同系统重调用不同内核的API 2.移植性: fopen 是C标准函数&#xff0c;具有良好的移植性&#xff1b; 而…

Vue 移动端(H5)项目怎么实现页面缓存(即列表页面进入详情返回后列表页面缓存且还原页面滚动条位置)keep-alive简单使用

一、需求 产品要求&#xff1a;Vue移动端项目进入列表页&#xff0c;列表页需要刷新&#xff0c;而从详情页返回列表页&#xff0c;列表页则需要缓存并且还原页面滚动条位置 二、实现思路 1、使用Vue中的keep-alive组件&#xff0c;keep-alive提供了路由缓存功能 2、因为我项…

基于知识图谱的推理:智能决策与自动发现

基于知识图谱的推理&#xff1a;智能决策与自动发现 一、引言 在今天这个数据驱动的时代&#xff0c;我们经常会听到人们提及“知识图谱”这个词。知识图谱&#xff0c;作为一种结构化知识的表达方式&#xff0c;已经成为智能系统不可或缺的一部分&#xff0c;它通过连接大量的…

ModuleNotFoundError: No module named ‘mlxtend‘

from mlxtend.plotting import plot_decision_regions 报错信息: ModuleNotFoundError: No module named mlxtend Jupyter和Spyder报错原因&#xff1a;因为anaconda下没有这个模块&#xff0c;需要安装mlxtend 解决方案&#xff1a; 1.打开anaconda(或终端) 2. 点击路径点…

项目文章| Plant CellDAP-seq解析草莓NAC转录因子FvRIF的调控网络

DAP-seq是一种体外研究蛋白与DNA结合的技术&#xff0c;该技术利用麦胚乳表达体系表达目标蛋白然后与基因组DNA文库体外孵育&#xff0c;得到目标蛋白的结合信息。与ChIP-seq和CUT&Tag不同&#xff0c;DAP-seq不需要抗体&#xff0c;在植物中应用更为广泛。今天我们分享一篇…

Java开发面试题分享

目录 1、简述MyISAM和InnoDB的区别 2、简述Hash和B树索引的区别 3、简述MyBatis的实现逻辑 4、#{}和${}的区别 5、简述Mybatis的优缺点 6、当实体类中的属性名和表中的字段名不一样时怎么办&#xff1f; 7、resultType与resultMap的区别 8、如何执行批量插入 9、Mybat…

[中级]软考_软件设计_计算机组成与体系结构_12_概述及回顾

概述及回顾 总纲考情分析与分值海明校验码计算公式重点 总纲 考情分析与分值 海明校验码计算公式 2 r m r 1 2^r mr1 2rmr1 重点 数据的表示是计算题型的基础计算机组成中的CPU组成计算机组成中的存储系统&#xff0c;是核心重点的考察CISC与RISC及流水线执行时间的求取

YOLOv8在windows平台的C++推理

前言 YOLOv8很多人很多人很熟悉了,现在V9都已经出来了,学习没有比别人更新的快! 个人记录一下在windows平台使用C++推理的记录。 环境配置 YOLOv8的传统的环境配置,就不多说,网上很多参考教程。 需要注意的点就是,本次C++推理需要使用OPENCV的DNN模块,所以我们需要下…

每日OJ题_BFS解决FloodFill①_力扣733. 图像渲染

目录 BFS解决FloodFill简介 力扣733. 图像渲染 解析代码 BFS解决FloodFill简介 FloodeFill算法即填充算法&#xff0c;中文&#xff1a;洪水灌溉&#xff0c;算法原理就是从一个点开始向四周扩散&#xff0c;向周围可以走到的点填充颜色&#xff0c;直到将可扩散到的点全部填…

ElasticSearch分词检索

1. 倒排索引&#xff1a;表示一种数据结构&#xff0c;分词词条与文档id集合的隐射关系 2. 它跟关系型数据库是一种互补的关系&#xff0c;因为关系型数据库支持事务操作&#xff0c;满足ACID原则 3. 索引库的文档字段只允许新增不允许修改 1.创建索引库 put /索引库名称2.1 …