(C语言)队列实现与用队列实现栈

目录

1.队列

1.1队列的概念及结构

1.2 队列的实际应用联想

1.3队列的实现

2. 队列应用——队列实现栈

主要思路


1.队列

1.1队列的概念及结构

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

1.2 队列的实际应用联想

1. 基于队列的特点--先进先出,可以联想到大厅服务中的叫号机先到的先拿号,先拿号的先办业务,队列中的人是在等的人,办完业务为出队列,取号为如队列。

2. 也可以是查找和自己间接相关的人,像是查找qq好友的好友,开始自己在队列中,后来将自己出队列,将自己好友入队列,再将队列中的人出来,他们的好友再入队列,当然入队列的时候肯定有限制,不能是和之前重复的,以此类推,即可知道和自己外围相关的人,

注(仅为有代码新人的有端联想,不一定真正适合这些情况)

1.3队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
下面我们来实现队列:
分两个文件:Queue.h与Queue.c
Queue.h进行头文件和函数的声明,以及队列结构的创建
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>

//方便后面对不同数据的操作
typedef int QDataType;

//链式队列-队列结点结构体
typedef struct QListNode
{
	QDataType _data;
	struct	QListNode* _pnext;
}QNode;

//队列结构体
typedef struct Queue
{
	QNode* _phead;
	QNode* _ptail;
	int _size;
}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 
bool QueueEmpty(Queue* q);
// 销毁队列
void QueueDestroy(Queue* q);

Queue.c进行队列相关函数的实现

#include "Queue.h"

//队列初始化
void QueueInit(Queue* pst)
{
	assert(pst);
	pst->_phead = pst->_ptail = NULL;
	pst->_size = 0;
}

// 队尾入队列
void QueuePush(Queue* pst,QDataType x)
{
	assert(pst);

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	newnode->_data = x;
	newnode->_pnext = NULL;
	if (pst->_phead == NULL)
	{
		pst->_phead = pst->_ptail = newnode;
	}
	else
	{
		pst->_ptail->_pnext = newnode;
		pst->_ptail = newnode;
	}
	pst->_size++;
}

// 队头出队列
void QueuePop(Queue* pst)
{
	assert(pst);
	assert(pst->_size);
	QNode* next = pst->_phead->_pnext;
	free(pst->_phead);
	pst->_phead = next;
	pst->_size--;
}

// 获取队列队尾元素
QDataType QueueBack(Queue* pst)
{
	assert(pst);
	assert(pst->_size);
	return pst->_ptail->_data;
}

// 获取队列头部元素
QDataType QueueFront(Queue* pst)
{
	assert(pst);
	assert(pst->_size);
	return pst->_phead->_data;
}

// 获取队列中有效元素个数
int QueueSize(Queue* pst)
{
	assert(pst);
	return pst->_size;
}

// 检测队列是否为空,如果为空返回True,如果非空返回False 
bool QueueEmpty(Queue* pst)
{
	assert(pst);
	return pst->_size == 0;
}

// 销毁队列
void QueueDestroy(Queue* pst)
{
	assert(pst);
	QNode* cur = pst->_phead;
	while (cur)
	{
		QNode* next = cur->_pnext;
		free(cur);
		cur = next;
	}
	pst->_size = 0;
	pst->_phead = pst->_ptail = NULL;
}

2. 队列应用——队列实现栈

225. 用队列实现栈 - 力扣(LeetCode)

题目:

我们用直接使用前队列的代码实现栈。

主要思路

创建两个队列相互导数据实现后进先出的效果,;压数据时直接在有数据的那个队列中插入数据,出栈时将有数据的队列中的size-1个数据导入另一个队列里,则第一个队列中剩下的那个数据是我们要出栈的数据,这就是主要思路。

下面是代码演示:(代码有点长但是前面的大部分都是前面实现队列的代码,直接复制粘贴的)

typedef int QDataType;
// 链式队列-队列结点结构体
typedef struct QListNode {
    QDataType _data;
    struct QListNode* _pnext;
} QNode;

// 队列结构体
typedef struct Queue {
    QNode* _phead;
    QNode* _ptail;
    int _size;
} Queue;

// 队列初始化
void QueueInit(Queue* pst) {
    assert(pst);
    pst->_phead = pst->_ptail = NULL;
    pst->_size = 0;
}

// 队尾入队列
void QueuePush(Queue* pst, QDataType x) {
    assert(pst);

    QNode* newnode = (QNode*)malloc(sizeof(QNode));
    newnode->_data = x;
    newnode->_pnext = NULL;
    if (pst->_phead == NULL) {
        pst->_phead = pst->_ptail = newnode;
    } else {
        pst->_ptail->_pnext = newnode;
        pst->_ptail = newnode;
    }
    pst->_size++;
}

// 队头出队列
void QueuePop(Queue* pst) {
    assert(pst);
    assert(pst->_size);
    QNode* next = pst->_phead->_pnext;
    free(pst->_phead);
    pst->_phead = next;
    pst->_size--;
}

// 获取队列队尾元素
QDataType QueueBack(Queue* pst) {
    assert(pst);
    assert(pst->_size);
    return pst->_ptail->_data;
}

// 获取队列头部元素
QDataType QueueFront(Queue* pst) {
    assert(pst);
    assert(pst->_size);
    return pst->_phead->_data;
}

// 获取队列中有效元素个数
int QueueSize(Queue* pst) {
    assert(pst);
    return pst->_size;
}

// 检测队列是否为空,如果为空返回True,如果非空返回False
bool QueueEmpty(Queue* pst) {
    assert(pst);
    return pst->_size == 0;
}

// 销毁队列
void QueueDestroy(Queue* pst) {
    assert(pst);
    QNode* cur = pst->_phead;
    while (cur) {
        QNode* next = cur->_pnext;
        free(cur);
        cur = next;
    }
    pst->_size = 0;
    pst->_phead = pst->_ptail = NULL;
}

typedef struct {
    Queue p1;
    Queue p2;
} MyStack;

MyStack* myStackCreate() {
    MyStack* st = (MyStack*)malloc(sizeof(MyStack));
    QueueInit(&(st->p1));
    QueueInit(&(st->p2));
    return st;
}

void myStackPush(MyStack* obj, int x) {
    if (!QueueEmpty(&(obj->p1))) {
        QueuePush(&(obj->p1), x);
    } else {
        QueuePush(&(obj->p2), x);
    }
}

int myStackPop(MyStack* obj) {
    Queue* empty = &(obj->p1);
    Queue* nonempty = &(obj->p2);
    if (!QueueEmpty(empty)) {
        empty = &(obj->p2);
        nonempty = &(obj->p1);
    }
    while (QueueSize(nonempty) > 1) {
        QueuePush(empty, QueueFront(nonempty));
        QueuePop(nonempty);
    }
    int ret = QueueFront(nonempty);
    QueuePop(nonempty);
    return ret;
}

int myStackTop(MyStack* obj) {
    if (!QueueEmpty(&obj->p1)) {
        return QueueBack(&(obj->p1));
    } else {
        return QueueBack(&(obj->p2));
    }
}
bool myStackEmpty(MyStack* obj) {
    return QueueEmpty(&(obj->p1)) && QueueEmpty(&(obj->p2));
}

void myStackFree(MyStack* obj) {
    QueueDestroy(&(obj->p1));
    QueueDestroy(&(obj->p2));
    free(obj);
}

各位看官姥爷点个赞再走吧,欢迎在评论区讨论。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

内网渗透瑞士军刀-impacket工具解析(二)

impacket工具解析之Kerberos认证协议 上一期我们介绍了impacket中ntlm协议的实现&#xff0c;在Windows认证中除了使用ntlm认证&#xff0c;还支持Kerberos认证协议&#xff0c;Kerberos认证也是Windows 活动目录中占比最高的认证方式。 什么是Kerberos协议&#xff1f; Kerb…

什么?你设计接口什么都不考虑?

如果让你设计一个接口&#xff0c;你会考虑哪些问题&#xff1f; 1.接口参数校验 接口的入参和返回值都需要进行校验。 入参是否不能为空&#xff0c;入参的长度限制是多少&#xff0c;入参的格式限制&#xff0c;如邮箱格式限制 返回值是否为空&#xff0c;如果为空的时候是…

第 397 场 LeetCode 周赛题解

A 两个字符串的排列差 模拟&#xff1a;遍历 s s s 记录各字符出现的位置&#xff0c;然后遍历 t t t 计算排列差 class Solution {public:int findPermutationDifference(string s, string t) {int n s.size();vector<int> loc(26);for (int i 0; i < n; i)loc[s…

红黑树底层封装map、set C++

目录 一、框架思考 三个问题 问题1的解决 问题2的解决&#xff1a; 问题3的解决&#xff1a; 二、泛型编程 1、仿函数的泛型编程 2、迭代器的泛型编程 3、typename&#xff1a; 4、/--重载 三、原码 红黑树 map set 一、框架思考 map和set都是使用红黑树底层&…

半监督的GCN:Semi-Supervised Classification With Graph Convolutional Networks

Semi-Supervised Classification With Graph Convolutional Networks -Theophilus Siameh-2017(2023) 思路 使用可扩展方法对图进行半监督学习,其中CNN应用在图数据上,得到GCN。 这种方法是在图的边的数量上进行线性的缩放模型,并学习包含局部图结构和图节点的几个隐藏层…

DiskANN数据布局

_mem.index.data&#xff1a;和sift_base.fbin一模一样。0-3字节是总向量数&#xff0c;4-7是每个向量的特征数。后面就是依次放置的每个向量。 _disk.index&#xff1a;是存储的图&#xff0c;但是不光包含图也包含原始向量。前4KB不知道存的是啥。从第0x1000开始存放的是原始…

【Python大数据】PySpark

CSDN不支持多个资源绑定&#xff0c;另外两个数据文件下载&#xff1a; 订单数据-json.zip search-log.zip Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服…

【Unity之FairyGUI】你了解FGUI吗,跨平台多功能高效UI插件

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

动手学深度学习19 卷积层

动手学深度学习19 卷积层 1. 从全连接到卷积2. 卷积层3. 代码4. QA 1. 从全连接到卷积 视频&#xff1a; https://www.bilibili.com/video/BV1L64y1m7Nh/?spm_id_from333.999.0.0&vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 3.6B元素 36亿元素–模型参数&#xff0c;存储…

JSP技术

三、JSP指令 1、page指令 在JSP页面中&#xff0c;经常需要对页面的某些特性进行描述&#xff0c;例如&#xff0c;页面的编码方式&#xff0c;JSP页面采用的语言等&#xff0c;这些特性的描述可以通过page指令实现。page指令的具体语法格式如下所示&#xff1a; <% page…

震撼发布!GPT-4o 上线!

5 月 14日凌晨一点&#xff0c;OpenAI 发布了 GPT-4o&#xff01; 新模型的功能简单概括就是&#xff1a;更快、更智能、更像人类。 秉承着持续更新的态度&#xff0c;Hulu AI 快速接入 GPT-4o 啦&#xff01; 继 5 月份上线 Suno 之后&#xff0c;这次是 Hulu AI 的又一重大…

机器学习入门介绍

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 三大方向机器学习产生的原因机器如何学习…

2024年第十届中西部外语翻译大赛

2024年第十届中西部外语翻译大赛 竞赛信息 “由中西部翻译协会共同体指导发起&#xff0c;各省市译协共建学术指导委员会&#xff0c;2024年第十届中西部外语翻译大赛由中西部翻译协会共同体秘书处&#xff08;武汉公仪网络科技有限公司&#xff09;承办。” - 获奖证书样图 -…

springSecurity快速入门

1. 介绍 springsecurity是安全框架&#xff0c;准确来说是安全管理框架。相比与另外一个安全框架Shiro&#xff0c;springsecurity提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富 springsecurity框架用于Web应用的需要进行认证和授权 认证&#xff1a;验证当前访问系统…

红蓝对抗 网络安全 网络安全红蓝对抗演练

什么是红蓝对抗 在军事领域&#xff0c;演习是专指军队进行大规模的实兵演习&#xff0c;演习中通常分为红军、蓝军&#xff0c;演习多以红军守、蓝军进攻为主。类似于军事领域的红蓝军对抗&#xff0c;网络安全中&#xff0c;红蓝军对抗则是一方扮演黑客&#xff08;蓝军&…

分享四款AI论文工具和降重技术

在科研领域&#xff0c;AI写作工具如同新一代的科研利器&#xff0c;它们能够极大提高文献查阅、思路整理和表达优化的效率&#xff0c;本质上促进了科研工作的进步。AI写作工具不仅快速获取并整理海量信息&#xff0c;还帮助我们精确提炼中心思想&#xff0c;显著提升论文写作…

如何隐藏计算机IP地址,保证隐私安全?

隐藏计算机的IP地址在互联网在线活动种可以保护个人隐私&#xff0c;这是在线活动的一种常见做法&#xff0c;包括隐私问题、安全性和访问限制内容等场景。那么如何做到呢?有很5种方法分享。每种方法都有自己的优点和缺点。 1. 虚拟网络 当您连接到虚拟服务器时&#xff0c;您…

数据结构——希尔排序

懒猫老师-数据结构-(62)希尔排序_哔哩哔哩_bilibili 对直接插人的改进 基本思想 将整个待排序记录分为若干子序列&#xff0c;在子序列内分别进行直接插入排序&#xff0c;待整个序列中的记录基本有序时&#xff0c;对全体记录进行直接插入排序。 分割排序的目的 1、减少待…

DeepSpeed

文章目录 一、关于 DeepSpeed1、DeepSpeed 是什么2、深度学习训练和推理的极致速度和规模3、DeepSpeed 的四大创新支柱1&#xff09;DeepSpeed 训练2&#xff09;DeepSpeed 推理3&#xff09;DeepSpeed 压缩4&#xff09;DeepSpeed4Science 4、DeepSpeed 软件套件DeepSpeed 库推…

公共命名空间和RHP

概述 RHP的全称是&#xff1a;the little Robot that Helped me Program&#xff0c;帮我编程序的小机器人。 RHP必然存在&#xff0c;C语言的宏、C的模板&#xff0c;都是RHP&#xff1b;更复杂的例子&#xff0c;是lex和yacc&#xff0c;它们是制作程序的程序&#xff0c;也…