【海贼王的数据航海】栈和队列

这篇具有很好参考价值的文章主要介绍了【海贼王的数据航海】栈和队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 -> 栈

1.1 -> 栈的概念及结构

1.2 -> 栈的实现

1.2.1 -> Stack.h

1.2.2 -> Stack.c

1.2.3 -> Test.c

2 -> 队列

2.1 -> 队列的概念及结构

2.2 -> 队列的实现

2.2.1 -> Queue.h

2.2.2 -> Queue.c


【海贼王的数据航海】栈和队列,数据结构,c语言,开发语言,数据结构,visualstudio

1 -> 栈

1.1 -> 栈的概念及结构

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

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

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

【海贼王的数据航海】栈和队列,数据结构,c语言,开发语言,数据结构,visualstudio

【海贼王的数据航海】栈和队列,数据结构,c语言,开发语言,数据结构,visualstudio

1.2 -> 栈的实现

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

【海贼王的数据航海】栈和队列,数据结构,c语言,开发语言,数据结构,visualstudio

【海贼王的数据航海】栈和队列,数据结构,c语言,开发语言,数据结构,visualstudio

1.2.1 -> Stack.h

#pragma once

#define  _CRT_SECURE_NO_WARNINGS 1

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

// 定长的静态栈的结构,实际中一般不实用
//typedef int STDataType;
//#define N 10
//typedef struct Stack
//{
//	STDataType a[N];
//	int top;
//}ST;

// 动态增长的栈
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

// 栈的初始化
void STInit(ST* pst);

// 栈的销毁
void STDestroy(ST* pst);

// 入栈
void STPush(ST* pst, STDataType x);

// 出栈
void STPop(ST* pst);

// 获取栈顶元素
STDataType STTop(ST* pst);

// 判空
bool STEmpty(ST* pst);

// 栈的有效元素个数
int STSize(ST* pst);

1.2.2 -> Stack.c

#include "Stack.h"

// 栈的初始化
void STInit(ST* pst)
{
	assert(pst);

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

// 栈的销毁
void STDestroy(ST* pst)
{
	assert(pst);

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

// 入栈
void STPush(ST* pst, STDataType x)
{
	if (pst->top == pst->capacity)
	{
		int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}

		pst->a = tmp;
		pst->capacity = newCapacity;
	}

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

// 出栈
void STPop(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));

	pst->top--;
}

// 获取栈顶元素
STDataType STTop(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));

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

// 判空
bool STEmpty(ST* pst)
{
	assert(pst);

	return pst->top == 0;
}

// 栈的有效元素个数
int STSize(ST* pst)
{
	assert(pst);

	return pst->top;
}

1.2.3 -> Test.c

#include "Stack.h"

void Test1()
{
	ST st;
	STInit(&st);

	STPush(&st, 1);
	STPush(&st, 2);
	printf("%d\n", STTop(&st));
	STTop(&st);
	STPush(&st, 3);
	STPush(&st, 4);
	STPush(&st, 5);

	while (!STEmpty(&st))
	{
		printf("%d ", STTop(&st));
		STPop(&st);
	}

	STDestroy(&st);
}

int main()
{

	Test1();

	return 0;
}

2 -> 队列

2.1 -> 队列的概念及结构

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

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

【海贼王的数据航海】栈和队列,数据结构,c语言,开发语言,数据结构,visualstudio

2.2 -> 队列的实现

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

【海贼王的数据航海】栈和队列,数据结构,c语言,开发语言,数据结构,visualstudio

2.2.1 -> Queue.h

#pragma once

#define  _CRT_SECURE_NO_WARNINGS 1

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

// 链式结构: 表示队列
typedef int QDataType;

typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;

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);

// 获取队列中有效元素个数
int QueueSize(Queue* pq);

// 判空
bool QueueEmpty(Queue* pq);

2.2.2 -> 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 = NULL;
	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->data = x;
	newnode->next = NULL;
	if (pq->ptail == NULL)
	{
		assert(pq->phead == NULL);

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

	pq->size++;
}

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

	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead = NULL;
		pq->ptail = NULL;
	}
	else
	{
		QNode* next = pq->phead->next;

		free(pq->phead);
	
		pq->phead = next;
	}

	pq->size--;
}

// 获取队头元素
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->phead->data;
}

// 获取队尾元素
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->ptail->data;
}

// 获取队列中有效元素个数
int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

// 判空
bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->size == 0;
}

感谢各位大佬支持!!!

互三啦!!!文章来源地址https://www.toymoban.com/news/detail-839948.html

到了这里,关于【海贼王的数据航海】栈和队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【海贼王的数据航海】排序——直接选择排序|堆排序

    目录 1 - 选择排序 1.1 - 基本思想 1.2 - 直接选择排序 1.2.1 - 代码实现 1.3 - 堆排序 1.3.1 - 代码实现 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 在元素集合arr[i] -- arr[n - 1]中选择关键码最大(或最小)的数据

    2024年03月19日
    浏览(31)
  • 【海贼王的数据航海】排序——概念|直接插入排序|希尔排序

    目录 1 - 排序的概念及其运用 1.1 - 排序的概念 1.2 - 常见的排序算法 2 - 插入排序 2.1 - 基本思想 2.2 - 直接插入排序 2.2.1 - 代码实现 2.3 - 希尔排序(缩小增量排序) 2.3.1 - 代码实现 排序 :所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的

    2024年03月25日
    浏览(40)
  • 【海贼王的数据航海】时间复杂度 | 空间复杂度

    目录 1 - 算法效率 1.1 - 如何衡量一个算法的好坏? 1.2 - 算法的复杂度 2 - 时间复杂度 2.1 - 时间复杂度的概念 2.2 - 大O的渐进表示法 2.3 - 常见时间复杂度计算 3 - 空间复杂度 4 - 常见复杂度对比 对于以下斐波那契数列: 用递归实现斐波那契数列,看上去代码十分简洁,但简洁一

    2024年03月14日
    浏览(41)
  • 大学生bootstrap框架网页作业成品 web前端大作业期末源码 航海王html+jquery+bootstrap响应式网页制作模板 学生海贼王动漫bootstrap框架网站作品

    HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐👇🏻👇🏻👇🏻 ❤ 【作者主页

    2024年02月11日
    浏览(79)
  • 【数据结构】栈和队列(队列篇)

    上期我们已经学习了数据结构中的栈,这期我们开始学习队列。 目录 1.队列的概念及结构 2.队列的实现 队列结构体定义 常用接口函数 初始化队列 队尾入队列 队头出队列 获取队列头部元素、 获取队列队尾元素 获取队列中有效元素个数 检测队列是否为空 销毁队列 3.循环队

    2024年02月13日
    浏览(42)
  • 【数据结构】栈和队列(链表模拟队列)

      学习本章节必须具备 单链表的前置知识, 建议提前学习:点击链接学习:单链表各种功能函数 细节 详解 本章节是学习用 单链表模拟队列 1. 单链表实现队列 思路如下 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先 进先出

    2024年04月27日
    浏览(44)
  • 数据结构---栈和队列

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

    2024年01月18日
    浏览(42)
  • 数据结构--栈和队列

    栈是一种常见的数据结构,它遵循 后进先出LIFO (Last In First Out)的原则。 进行数据插入和操作的一端称为栈顶,另一端称为栈底 。 压栈 :栈的插入操作被称为压栈/进栈/入栈,入数据在栈顶。 出栈 :栈的删除操作。出数据也在栈顶; 栈可以用 数组 或者是 链表 来实现;

    2024年02月09日
    浏览(42)
  • 数据结构 | 栈和队列

    … 📘📖📃本文已收录至:数据结构 | C语言 更多知识尽在此专栏中! 栈(Stack) 又名堆栈,它是一种运算受限的线性表,限定仅在表尾进行插入和删除操作的线性表。 队列(Queue) 也是一种特殊的线性表,特殊之处在于它只允许在表的前端(Front)进行删除操作,而在表的

    2024年01月23日
    浏览(44)
  • 数据结构——栈和队列

    目录  一.前言 二.前文回顾 三.栈 3.1 栈的概念及结构 3.2 栈的实现 3.2.1 初始化函数 3.2.2 销毁函数 3.2.3 入栈函数 3.2.4 出栈函数 3.2.5 计算大小函数 3.2.6 空栈函数 3.2.7 获取栈顶函数  3.2.8 小测试 3.3 全部代码 四.栈的练习 4.1 有效的括号 五.队列 5.1队列的概念及结构 5.2 队列的实

    2024年01月25日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包