数据结构-栈和队列

news2024/9/22 21:12:25

目录

  • 🤡前言
  • 👍栈
    • 😠栈的概念及结构
    • 😠栈的实现
  • 👍队列
    • 😠队列的概念及结构
    • 😠队列的实现
  • 💡总结

🤡前言

本篇博客主要记录的是栈和队列的学习和总结。

👍栈

😠栈的概念及结构

:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
栈的后进先出视图如下:
在这里插入图片描述


😠栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
在这里插入图片描述
代码实现:
Stack.h

#include <stdio.h>
#include <malloc.h>
#include <assert.h>

// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;
	int _top; // 栈顶
	int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps);
// 入栈
void StackPush(Stack* ps, STDataType data);
// 出栈
void StackPop(Stack* ps);
// 获取栈顶元素
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps);
// 销毁栈
void StackDestroy(Stack* ps);

Stack.c

// 初始化栈
void StackInit(Stack* ps)
{
	assert(ps);
	ps->_a = (STDataType*)malloc(sizeof(STDataType) * 5);
	ps->_capacity = 5;
	ps->_top = 0;
}

// 入栈
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	if (ps->_capacity == ps->_top)
	{
		//扩容
		STDataType* p = (STDataType*)realloc(ps->_a, sizeof(STDataType) * ps->_capacity * 2);
		if (p == NULL)
		{
			printf("realloc fail\n");
			return;
		}
		else {
			ps->_a = p;
			ps->_capacity *= 2;
			printf("realloc finish\n");
		}
	}
	ps->_a[ps->_top++] = data;
}

// 出栈
void StackPop(Stack* ps)
{
	assert(ps);
	if (ps->_top <= 0)
	{
		printf("nothing to pop\n");
		return;
	}
	ps->_top--;
}

// 获取栈顶元素
STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->_a);
	return ps->_a[ps->_top - 1];
}

// 获取栈中有效元素个数
int StackSize(Stack* ps)
{
	assert(ps);
	return ps->_top;
}

// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->_top > 0 ? 0 : 1;
}

// 销毁栈
void StackDestroy(Stack* ps)
{
	free(ps->_a);
	ps->_a = NULL;
	ps->_capacity = 0;
	ps->_top = 0;
}

test.c

int main()
{
	Stack ps;
	// 初始化栈
	StackInit(&ps);
	//入栈
	StackPush(&ps, 1);
	StackPush(&ps, 2);
	StackPush(&ps, 3);
	StackPush(&ps, 4);
	StackPush(&ps, 5);
	StackPush(&ps, 6);
	//出栈
	StackPop(&ps);
	StackPop(&ps);
	StackPop(&ps);
	//获取栈顶元素
	STDataType ret = StackTop(&ps);
	// 获取栈中有效元素个数
	int sz = StackSize(&ps);
	// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
	int t = StackEmpty(&ps);
	// 销毁栈
	StackDestroy(&ps);
	return 0;
}

👍队列

😠队列的概念及结构

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

😠队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
入队
在这里插入图片描述
出队
在这里插入图片描述
空队列
front = NULLrear = NULL

代码实现
Queue.h

#include <stdio.h>
#include <assert.h>
#include <malloc.h>

// 链式结构:表示队列
typedef int QDataType;
typedef struct QListNode
{
	struct QListNode* _pNext;
	QDataType _data;
}QNode;
// 队列的结构
typedef struct Queue
{
	QNode* _front;
	QNode* _rear;
}Queue;
// 初始化队列
void QueueInit(Queue* q);
// 队尾入队列
void QueuePush(Queue* q, QDataType data);
// 队头出队列
void QueuePop(Queue* q);
// 获取队列头部元素
QDataType QueueFront(Queue* q);
// 获取队列队尾元素
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q);
// 销毁队列
void QueueDestroy(Queue* q);

Queue.c

// 初始化队列
void QueueInit(Queue* q)
{
	assert(q);
	q->_front = q->_rear = NULL;
}

// 队尾入队列
void QueuePush(Queue* q, QDataType data)
{
	QNode* node = (QNode*)malloc(sizeof(QNode));
	node->_data = data;
	node->_pNext = NULL;
	if (q->_rear == NULL)
	{
		q->_front = q->_rear = node;
	}
	else
	{
		q->_rear->_pNext = node;
		q->_rear = node;
	}
}

// 队头出队列
void QueuePop(Queue* q)
{
	if (q->_front == NULL)
	{
		printf("nothing to pop\n");
		return;
	}
	QNode* node = q->_front;
	q->_front = q->_front->_pNext;
	node->_pNext = NULL;
	free(node);
}

// 获取队列头部元素
QDataType QueueFront(Queue* q)
{
	return q->_front->_data;
}

// 获取队列队尾元素
QDataType QueueBack(Queue* q)
{
	return q->_rear->_data;
}

// 获取队列中有效元素个数
int QueueSize(Queue* q)
{
	int sz = 0;
	QNode* p = q->_front;
	while (p != NULL)
	{
		sz++;
		p = p->_pNext;
	}
	return sz;
}

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q)
{
	return q->_rear == NULL ? 1 : 0;
}

// 销毁队列
void QueueDestroy(Queue* q)
{
	q->_rear = NULL;
	while (q->_front)
	{
		QNode* p = q->_front;
		q->_front = p->_pNext;
		p->_pNext = NULL;
		free(p);
	}
}

test.c

int main()
{
	Queue q;
	// 初始化队列
	QueueInit(&q);
	// 队尾入队列
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	print(&q);
	// 队头出队列
	QueuePop(&q);
	print(&q);
	// 获取队列头部元素
	printf("%d\n", QueueFront(&q));
	// 获取队列队尾元素
	printf("%d\n", QueueBack(&q));
	// 获取队列中有效元素个数
	printf("%d\n", QueueSize(&q));
	// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
	printf("%d\n", QueueEmpty(&q));
	// 销毁队列
	QueueDestroy(&q);
	print(&q);
	return 0;
}

💡总结

记录队列和栈的学习利用代码实现,如有BUG的话还请指正。

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

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

相关文章

虹科分享 | 如何解决CAN与以太网之间的信息有效传递与智能变送难题?

背景 在工业中&#xff0c;一般把现场总线应用于车间、生产现场等生产第一线&#xff0c;作为控制网络&#xff0c;而以太网主要应用于企业管理层和生产监控层。由于不同现场总线之间没有统一标准、难以接入因特网等缺点&#xff0c;使得目前大部分企业控制网络与信息网络相互…

猎聘和BOSS直聘谁会成为在线招聘的最后赢家?

文|螳螂观察 作者|易不二 在线招聘行业正在焕发新的巨大活力。 12月22日&#xff0c;BOSS直聘正式在港交所主板完成双重主要上市。BOSS直聘创始人赵鹏扬言&#xff0c;公司未来三年内有一个获取一亿用户的“小目标”&#xff0c;纯蓝领市场是公司完成这一目标的重要增长动力…

移位操作符和位操作符(从概念到相关算法题详解)

目录 概念 基础知识 左移操作符(<<) 右移操作符(>>) 按位与(&) 按位或(|) 异或(^) 相关算法题 1.不能创建临时变量(第三个变量),实现俩个数的交换 方法1: 方法2: 写一个方法,返回参数中二进制中1的个数 方法1: 方法2: 方法3: 俩个int(32位)整…

2019年数维杯国际大学生数学建模C题猪肉价格波动分析求解全过程文档及程序

2019年数维杯国际大学生数学建模 C题 猪肉价格波动分析 问题重述&#xff1a; 中国是一个育种大国。猪肉产业在畜牧业中起着主导作用。同时&#xff0c;猪肉已成为人们餐桌上的主要肉类来源之一。随着人口的增加&#xff0c;消费和生活也得到了改善。 2018年8月3日&#xff0…

Android Studio中设置Compose 代码模版

File Templates 有两种方式能找到编辑File Templates的入口 在 File -> New -> Edit File Templates 或者 在项目结构目录中点击右键菜单 New -> Edit File Templates 在设置界面中的 Editor -> File and Code Templates #if (${PACKAGE_NAME} && ${…

dwg怎么转成dxf格式?手机也能轻松操作

dwg怎么转成dxf格式呢&#xff1f;相信很多小伙伴应该知道这两种格式都是CAD图纸中的一种&#xff0c;那么它们有什么区别呢&#xff1f;第一&#xff0c;性质不同dwg图形文件是计算机辅助设计软件AutoCAD用来保存设计数据的专有文件格式。dxf图形文件是DWG格式的ASCII格式变体…

Codeforces Global Round 14 E Phoenix and Computers

大意&#xff1a; 一排电脑&#xff0c;每次可以选择打开一台电脑&#xff0c;如果某一台电脑相邻的左边和右边都被打开了&#xff0c;它会自动打开。问打开n台电脑的方案数 思路&#xff1a; O(n^3)做法 不难发现&#xff0c;在操作过程中&#xff0c;一台台电脑其实就是被…

电磁明渠流量计怎么安装?

1、设备介绍 电磁明渠流量计是由流量显示仪、流速计、液位计组成的流速面积法测流量的明渠测量流量系统。 工作原理&#xff1a;基于法拉第电磁感应定律&#xff0c;当导电流体流过电磁式流速仪的磁场时&#xff0c;在与流速和磁场两者相垂直的方向就会产生与平均流速成正比的…

C++ 数学与算法系列之牛顿、二分迭代法求解非线性方程

1. 前言 前文介绍了如何使用“高斯消元法”求解线性方程组。 本文秉承有始有终的态度&#xff0c;继续介绍“非线性方程”的求解算法。 本文将介绍 2 个非线性方程算法&#xff1a; 牛顿迭代法。二分迭代法。 牛顿迭代法&#xff08;Newtons method&#xff09;又称为牛顿…

千万别熬夜:只有睡觉,才能修复DNA损伤

睡眠是人体的一种修复过程&#xff0c;可以恢复精神和解除疲劳。人的一生中&#xff0c;大约三分之一的时间是在睡眠中度过&#xff0c;良好的睡眠是国际社会公认的三项健康标准之一&#xff0c;而睡眠时间过短或睡眠不佳均会影响健康。在中国&#xff0c;超3亿人存在睡眠障碍、…

基于智能电控柜原理的物联网云平台方案

本方案基于智能电控柜的原理&#xff0c;通过无线传输模块将现场采集到的数据经过无线网络发送到物联网云平台&#xff0c;同时可通过云组态和数据中心将现场画面所见即所得的同步到互联网终端。 用户在安装有监控软件后&#xff0c;可以用手机 APP或者在云平台上直接控制电控柜…

Ubuntu自动登录脚本,expect自动切换用户,xshell自动登录脚本

Ubuntu自动登录脚本&#xff0c;expect自动切换用户&#xff0c;xshell自动登录脚本一、!/usr/bin/expect -f的意义二、spawn命令行&#xff1a;三、send命令&#xff1a;四、expect五、interact命令&#xff1a;六、xshell自动化脚本1、怎么使用脚本2、编写脚本3、vbs的不足本…

https访问流程详解

1. 基础知识 1.1 https起源 鲍勃有两把钥匙&#xff0c;一把是公钥&#xff0c;另一把是私钥。 鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。 苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密&#xff0c;就可以达到保密的效果。 鲍勃收信后&#xf…

jvm-sandbox:基础了解及demo演示

文章目录一、基础准备-被测应用二、代码编写-自定义Module三、jvm-sandbox安装及基础命令四、jvm-sandbox demo演示4.1、改变方法返回4.2、异常注入五、资源链接一、基础准备-被测应用 准备&#xff1a;先创建一个基础的SpringBoot项目并打jar包后在服务器启动 RestControll…

TP5反序列化利用链

说明 该文章来源于同事lu2ker转载至此处&#xff0c;更多文章可参考&#xff1a;https://github.com/lu2ker/ 文章目录说明TP5反序列化利用链下图是Mochazz 大佬画的非常优雅的一张调用链图Action&#xff01;CUT&#xff01;TP5反序列化利用链 本文以第二人称视角重点谈谈给…

max蒙皮动画+动作

首先关于max人物动画&#xff01;如何制作&#xff01; 首先&#xff01; 我们要准备一个模型&#xff01;人物的模型&#xff01; 这是一个人物模型&#xff01;obj的&#xff01;没有任何东西&#xff01;你也可以选择其他&#xff0c;我是从虚幻里面直接导出的&#xff0…

太卷了,华为某领导说招外包只要985!

你听说过华为od吗&#xff1f;od是outsourcing dispatch&#xff08;外包派遣&#xff09;的简称&#xff0c;虽然华为每年会挑选一部分优秀的od员工转为华为正编员工&#xff0c;但od本质上还是外包。最近一位华为员工爆料&#xff1a;太卷了&#xff01;领导说招od员工也要98…

玻纤效应对skew的影响(二)

玻纤效应对对内skew的影响 参数对对内Skew的影响 在一个差分对中&#xff0c;对内skew是由PN走线Dk的差异造成的。导致Dk有差异的原因有很多&#xff0c;例如走线位置&#xff0c;core和pp的玻璃束位置&#xff0c;走线宽度等等。但是这些因素影响角度也不同&#xff0c;下图…

应用程序已被Java 安全阻止-- 如何全局设置Java 控制面板参数

最近遇到一个客户问题&#xff0c;客户方存在一个使用场景为使用IE访问一个页面 之后通过点击页面的按钮调起一个applet程序&#xff0c;结果遇到了一个弹窗告警&#xff1a;应用程序已被Java安全阻止。 对于这个问题 解决方案有两个&#xff1a; 1.将访问的页面站点加入到例外…

BGP在数据中心的应用2——BGP如何适应数据中心网络

注&#xff1a; 本文根据《BGP in the Datacenter》整理&#xff0c;有兴趣和英文阅读能力的朋友可以直接看原文&#xff1a;https://www.oreilly.com/library/view/bgp-in-the/9781491983416/上一部分笔记请参考&#xff1a;https://blog.csdn.net/tushanpeipei/article/deta…