数据结构->手把手教入门栈与列队(基础)

这篇具有很好参考价值的文章主要介绍了数据结构->手把手教入门栈与列队(基础)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉

🍎个人主页:橘橙黄又青-CSDN博客

1.什么是栈

1.1栈的概念及结构

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

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

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

这种结构类似于弹夹:遵守后进先出的原则

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

 1.2栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上 插入数据的代价比较小。

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言 

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

2.栈的实现

这里我们讲解数组(顺序表)实现

2.1栈的初始化和销毁

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

这里顺序表一样,a是数组,free是释放一块连续的空间。

2.2栈的节点创建

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

这里注意的是创建后,记得top++;

2.3出栈和返回栈顶元素

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

2.4返回栈的数据个数和判断栈为空

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

2.5测试代码:

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

这里我们讲一个点,我们只创建一个栈Stack s,如果要创建两个栈,最好使用结构体包装起来,比如说:

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

这样就可以直接创建两个顺序表了。

3.什么是列队

3.1队列的概念及结构

列队列队其实可以理解为排队

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

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

4.列队的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构, 出队列在数组头上出数据,效率会比较低。

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

所以我们选择链表实现。

4.1列队初始化和销毁

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

4.2入队列

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

4.3出队列

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言 出队列是链表的头删操作。

4.4找到列队头尾

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言

4.5列队判断为空和数据个数

数据结构->手把手教入门栈与列队(基础),数据结构,数据结构,java,开发语言 

5.代码

5.1列队代码:

Queue.h

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


typedef int QDataType;
typedef struct QueueNode
{
	int val;
	struct QueueNode* next;
}QNode;

 入队列
//void QueuePush(QNode** pphead, QNode** pptail);

 出队列
//void QueuePop(QNode** pphead, QNode** pptail);

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;
//初始化
void QueueInit(Queue* pq);
//列队销毁
void QueueDestroy(Queue* pq);

// 入队列
void QueuePush(Queue* pq, QDataType x);
// 出队列
void QueuePop(Queue* pq);
//列队前
QDataType QueueFront(Queue* pq);
//列队尾
QDataType QueueBack(Queue* pq);
//判断是否为空
bool QueueEmpty(Queue* pq);
//数据个数
int QueueSize(Queue* pq);


Queue.c

#include"Queue.h"
//初始化
void QueueInit(Queue* pq)
{
	assert(pq);

	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

void QueueDestroy(Queue* pq)
{
	assert(pq);

	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);

		cur = next;
	}

	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

// 入队列
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}

	newnode->val = x;
	newnode->next = NULL;

	if (pq->ptail)
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	else
	{
		pq->phead = pq->ptail = newnode;
	}

	pq->size++;
}

// 出队列
void QueuePop(Queue* pq)
{
	assert(pq);

	// 0个节点
	// 温柔检查
	//if (pq->phead == NULL)
	//	return;

	// 暴力检查 
	assert(pq->phead != NULL);

	// 一个节点
	// 多个节点
	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	else
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}

	pq->size--;
}
//返回队列头
QDataType QueueFront(Queue* pq)
{
	assert(pq);

	// 暴力检查 
	assert(pq->phead != NULL);

	return pq->phead->val;
}
//返回队列尾
QDataType QueueBack(Queue* pq)
{
	assert(pq);

	// 暴力检查 
	assert(pq->ptail != NULL);

	return pq->ptail->val;
}

bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->size == 0;
}

int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

Test.c

//队列,链表实现
#include"Queue.h"

int main()
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, 1);
	QueuePush(&q, 2);

	printf("%d ", QueueFront(&q));
	QueuePop(&q);

	QueuePush(&q, 3);
	QueuePush(&q, 4);

	while (!QueueEmpty(&q))
	{
		printf("%d ", QueueFront(&q));
		QueuePop(&q);
	}

	QueueDestroy(&q);

	return 0;
}

5.1栈代码:

Stack.h

#pragma once

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

//方便以后改数据类型
typedef int STDataType;
//顺序表
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}Stack;

//初始化
void STInit(Stack* ps);

//栈销毁
void STDestroy(Stack* ps);

//进栈
void STPush(Stack* ps, STDataType x);

//出栈
void STPop(Stack* ps);

//出栈顶元素
STDataType STTop(Stack* ps);

//链表数据个数
int STSize(Stack* ps);

//判断链表为不为空
bool STEmpty(Stack* ps);

Stack.c

#include"Stack.h"

void STInit(Stack* ps)
{
	assert(ps);

	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

void STDestroy(Stack* ps)
{
	assert(ps);

	free(ps->a);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}


void STPush(Stack* ps, STDataType x)
{
	assert(ps);

	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}

		ps->a = tmp;
		ps->capacity = newcapacity;
	}

	ps->a[ps->top] = x;
	ps->top++;
}

void STPop(Stack* ps)
{
	assert(ps);
	assert(!STEmpty(ps));

	ps->top--;
}

STDataType STTop(Stack* ps)
{
	assert(ps);
	assert(!STEmpty(ps));

	return ps->a[ps->top - 1];
}

int STSize(Stack* ps)
{
	assert(ps);

	return ps->top;
}

bool STEmpty(Stack* ps)
{
	assert(ps);

	return ps->top == 0;
}

Test.c

//栈,顺序表实现

#include"Stack.h"

int main()
{
	Stack s;
	STInit(&s);
	STPush(&s, 1);
	STPush(&s, 2);
	STPush(&s, 3);

	int top = STTop(&s);
	printf("%d ", top);
	STPop(&s);

	top = STTop(&s);
	printf("%d ", top);
	STPop(&s);

	STPush(&s, 4);
	STPush(&s, 5);

	while (!STEmpty(&s))
	{
		int top = STTop(&s);
		printf("%d ", top);
		STPop(&s);
	}

	STDestroy(&s);

	return 0;
}

今天的分享就到这里了,点个赞,谢谢。文章来源地址https://www.toymoban.com/news/detail-842884.html

到了这里,关于数据结构->手把手教入门栈与列队(基础)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 速学数据结构 | 手把手教你会单链表的构建方式

    速学数据结构 | 手把手教你会单链表的构建方式

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 : 《初阶数据结构》《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊!今天给大家带来的是初阶数据结构中单链表的构建方式,手把手教会你单链表 !    ⛳️ 链表是指一种逻辑上是连在一

    2024年02月08日
    浏览(78)
  • 【图解数据结构】顺序表实战指南:手把手教你详细实现(超详细解析)

    【图解数据结构】顺序表实战指南:手把手教你详细实现(超详细解析)

    🌈个人主页: 聆风吟 🔥系列专栏: 图解数据结构、算法模板 🔖少年有梦不应止于心动,更要付诸行动。 线性表(linear list):线性表是一种数据结构,由n个具有相同数据类型的元素构成一个有限序列。 线性表可以用数组、链表、栈等方式实现,常见的线性表有数组、链

    2024年01月22日
    浏览(57)
  • 【数据结构】—手把手带你用C语言实现栈和队列(超详细!)

    【数据结构】—手把手带你用C语言实现栈和队列(超详细!)

                                       食用指南:本文在有C基础的情况下食用更佳                                     🔥 这就不得不推荐此专栏了:C语言                                   ♈️ 今日夜电波:Tell me —milet                    

    2024年02月14日
    浏览(250)
  • 【数据结构】万字一文手把手解读哈希————(开/闭散列)解决哈希冲突完整详解(6)

    【数据结构】万字一文手把手解读哈希————(开/闭散列)解决哈希冲突完整详解(6)

    前言 大家好吖,欢迎来到 YY 滴 数据结构 系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《

    2024年02月04日
    浏览(133)
  • 数据结构之链表 - 超详细的教程,手把手教你认识并运用链表

    数据结构之链表 - 超详细的教程,手把手教你认识并运用链表

    顺序表只适合静态的查找和更新,不适合插入和删除元素, 因为在ArrayList中插入和删除元素时,由于需要将后序元素往前后者往后移动,所以时间复杂度会相当高,能达到O(N)。 为了解决这一问题,java 引入了 LinkedList(链表)。 链表是一种 逻辑上连续,物理上不连续 的存储结

    2024年02月09日
    浏览(45)
  • 数据结构:线性表————顺序表的实现、项目和OJ题目(手把手教你写代码)

    数据结构:线性表————顺序表的实现、项目和OJ题目(手把手教你写代码)

    🌈 个人主页: 小新_- 🎈个人座右铭:“成功者不是从不失败的人,而是从不放弃的人!”🎈 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝 🏆所属专栏:  话说那些与C++的爱恨情仇   欢迎订阅,持续更新中~~~                                           ✨让小新带着你

    2024年04月16日
    浏览(117)
  • 数据结构之栈和队列 - 超详细的教程,手把手教你认识并运用栈和队列

    数据结构之栈和队列 - 超详细的教程,手把手教你认识并运用栈和队列

    栈:后进先出 队列:先进先出 栈:是一种特殊的 线性表 , 只允许在固定的一端插入或者删除元素 ,一个栈包含了栈顶和栈底。只能在栈顶插入或者删除元素。 栈的底层 是由 数组 实现的。 栈遵循先入后出原则,也就是先插入的元素得到后面才能删除,后面插入的元素比

    2024年02月07日
    浏览(45)
  • 四步带你爬虫入门,手把手教学爬取电影数据

    四步带你爬虫入门,手把手教学爬取电影数据

    本文内容是通过Pycharm来进行实操 创建项目的虚拟环境,目的是为了不让其他的环境资源干扰到当前的项目 本文将以豆瓣作为手把手学习参考,网址:https://movie.douban.com/top250, 1. 进入Terminal终端,安装我们需要的scrapy模块 pip install scrapy 2. 通过pycharm进入Terminal终端,输入我们

    2024年02月22日
    浏览(179)
  • Python爬虫入门教程!手把手教会你爬取网页数据

    Python爬虫入门教程!手把手教会你爬取网页数据

    其实在当今社会,网络上充斥着大量有用的数据,我们只需要耐心的观察,再加上一些技术手段,就可以获取到大量的有价值数据。这里的“技术手段”就是网络爬虫。今天就给大家分享一篇爬虫基础知识和入门教程: 爬虫就是自动获取网页内容的程序,例如搜索引擎,Go

    2023年04月26日
    浏览(82)
  • 手把手入门MO | 如何使用使用 Spark 将批量数据写入 MatrixOne

    手把手入门MO | 如何使用使用 Spark 将批量数据写入 MatrixOne

    Apache Spark 是一个为高效处理大规模数据而设计的分布式计算引擎。它采用分布式并行计算的方式,将数据拆分、计算、合并的任务分散到多台计算机上,从而实现了高效的数据处理和分析。 大规模数据处理与分析 Spark 能够处理海量数据,通过并行计算任务提高了处理效率。

    2024年02月01日
    浏览(563)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包