【C++】队列来喽,真的很简单的

news2025/7/23 12:23:26

我们经历了那么多练习和顺序表,链表,栈的大风大浪,小小一个队列可以说简单至极了

练习,以及顺序表之类的文章都在我的主页哦,请认真学习之后再看本文

目录

1.队列的结构

2.实现

3.栈和队列的相互实现


1.队列的结构

队列其实就是一种特殊的栈(从结构上来说),他是队头出数据,队尾入数据

 所以有一种很可怕的题目就是栈和队列的相互实现

2.实现 

我们还是先学习一下队列的实现吧

由于用数组实现和栈一样,但是他不像栈,只在一头出入,所以还需要一个结构体来封装他的头指针和尾指针

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int type;
typedef struct QlistNode
{
	type data;
	struct QlistNode* next;
}Q;
typedef struct QNode
{
	Q* front;
	Q* tail;
	int size;
}QL;

void QuenceInit(QL* q);//初始化
void QuencePop(QL* q);//头删
void QuencePush(QL* q, type x);//尾插
bool QEmpty(QL* q);//是否为空
type QFront(QL* q);//获取头部元素
type QBack(QL* q);//获取尾部元素
void QDestory(QL* q);//销毁
int QSize(QL* q);//获取有效元素个数
void QPirnt(QL* q);//打印队列的元素

实现起来也是没什么区别,只是他的结构内容有点多,不要搞晕

#include "quence.h"

void QuenceInit(QL* q)//初始化
{
	assert(q);
	q->front = NULL;
	q->tail = NULL;
	q->size = 0;
}
void QuencePop(QL* q)//头删
{
	assert(q);
	assert(!QEmpty(q));
	if (q->front->next == NULL)
	{
		free(q->front);
		q->front = q->tail = NULL;
	}
	else
	{
    Q* cur = q->front;
	Q* next = cur->next;
	free(cur);
	cur = next;
	q->front = next;
	}
	q->size--;
}
void QuencePush(QL* q,type x)//尾插
{
	Q* newnode = (Q*)malloc(sizeof(Q));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->data = x;
newnode->next = NULL;
	if (q->front == NULL && q->tail == NULL)
	{
		q->front = q->tail = newnode;
	}
	else
	{
		q->tail->next = newnode;
		q->tail = newnode;
	}
	q->size++;
}
bool QEmpty(QL* q)//是否为空
{
	assert(q);
	return q->front == NULL &&q->tail==NULL;
}//空就是1
type QFront(QL* q)//获取头部元素
{
	assert(q);
	assert(!QEmpty(q));
	return q->front->data;
}
type QBack(QL* q)//获取尾部元素
{
	assert(q);
	assert(!QEmpty(q));
	return q->tail->data;
}
void QDestory(QL* q)//销毁
{
	assert(q);
	Q* cur = q->front;
	while (cur)
	{
     /*Q* next = cur->next;
	cur = next;
	free(next);*/
		Q* del = cur;
		cur = cur->next;
		free(del);
	}
	q->front = q->tail = NULL;
	q->size = 0;
}
int QSize(QL* q)//获取有效元素个数
{
	assert(q);
	return q->size;
}
void QPirnt(QL* q)//打印队列的元素
{
	assert(q);
	Q* cur = q->front;
	while (cur)
	{
		printf("%d ", cur->data);
		cur = cur->next;
	}
	printf("\n");
}

3.栈和队列的相互实现

队列实现栈

队列——》栈

基于队列一侧出 一侧入的特点,要想变成栈

当push 1 2 3 4

在pop的时候就应该先pop 4  因为栈先入的后出

所以队列的push还是保留没问题

但是pop就需要把有数据的那个队列除了最后一个元素都转移到空队列里面

 

 由于我们使用C的方法写,所以前面要加上刚才的队列实现

typedef struct {
 QL q1;
 QL q2;
} MyStack;


MyStack* myStackCreate() {
MyStack* obj=(MyStack*)malloc(sizeof(MyStack));
QuenceInit(&(obj->q1));
QuenceInit(&(obj->q2));
return obj;

}

void myStackPush(MyStack* obj, int x) {
    //直接尾插
    if(!QEmpty(&obj->q1))
    {
        QuencePush(&obj->q1,x);
    }
    else{
        QuencePush(&obj->q2,x);

    }
}
int myStackPop(MyStack* obj) {
QL *empty=&obj->q1;
QL *nonempty=&obj->q2;
if(!QEmpty(&obj->q1)) //假设错误,实际q1非空
{
empty=&obj->q2;
nonempty=&obj->q1;
}

while(QSize(nonempty)>1)
{
    QuencePush(empty,QFront(nonempty));
    QuencePop(nonempty);
}
int top=QFront(nonempty);
QuencePop(nonempty);
return top;
}
int myStackTop(MyStack* obj) { 
if(!QEmpty(&obj->q1))
{
    return QBack(&obj->q1);
}
else{
    return QBack(&obj->q2);
}
}

bool myStackEmpty(MyStack* obj) {//两个队列都是空的
return QEmpty(&obj->q1)&&QEmpty(&obj->q2);
}

void myStackFree(MyStack* obj) {
QDestory(&obj->q1);
QDestory(&(obj->q2));
free(obj);
}

栈实现队列

栈——>队列

当我们push 1 2 3 4

最后要实现队列,所以应该先pop 1 

所以还是栈的压数据可以保留,但是pop需要变一变

 

 我们发现,如果还是之前的思路乱套了,1确实是没了,但是相同的办法2就删不掉了,下一个删的就是4,显然不对

新思路就是定义一个push栈和pop栈

在pop的时候先拿走pop栈的栈顶元素此时就是题目给的peek函数

如果pop是空栈,但是push不是空,就把push依次出数据到pop,然后返回pop栈的栈顶元素

此时再pop 2 3..都很好处理了

还是在前面先写上我们栈的实现

typedef struct {
ST push;
ST pop;
} MyQueue;
bool myQueueEmpty(MyQueue* obj) {
    return Empty(&obj->push) && Empty(&obj->pop);
}



MyQueue* myQueueCreate() {
MyQueue* q=(MyQueue*)malloc(sizeof(MyQueue));
InitST(&q->push);
InitST(&q->pop);
return q;
}

void myQueuePush(MyQueue* obj, int x) {
    assert(obj);
PushST(&obj->push,x);
}

int myQueuePop(MyQueue* obj) {
    assert(obj);
    assert(!myQueueEmpty(obj));
int peek=myQueuePeek(obj);
PopST(&obj->pop);
return peek;
}

int myQueuePeek(MyQueue* obj) {
    assert(obj);

    assert(!myQueueEmpty(obj));

if(Empty(&obj->pop))
{
    while(!Empty(&obj->push))
    {
        PushST(&obj->pop,StackTop(&obj->push));
        PopST(&obj->push);
    }
}
return StackTop(&obj->pop);
}


void myQueueFree(MyQueue* obj) {
DestoryST(&obj->pop);
DestoryST(&obj->push);
free(obj);
}

学会了吗~~~

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

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

相关文章

Postgresql源码(88)column definition list语义解析流程分析

0 总结 如果调用函数时同时满足以下几种情况 在from后面。返回值为RECORD&#xff08;或者是anyelement表示的RECORD&#xff09;&#xff08;anyelement的实际类型由入参决定&#xff0c;入参是RECORD&#xff0c;返回就是RECORD&#xff09;。返回值被判定为TYPEFUNC_RECOR…

11.18 - 每日一题 - 408

每日一句&#xff1a;不如就利用孤单一人的时间&#xff0c;使自己变得更优秀&#xff0c;给来的人一个惊喜&#xff0c;也给自己一个好的交代 数据结构 1 当一棵有n个结点的二叉树按层次从上到下&#xff0c;同层次从左到右将结点中的数据存放在一维数组A[1…n&#xff3d;中…

Android App事件交互Event之模仿京东App实现下拉刷新功能(附源码 可直接使用)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、正常下拉与下拉刷新的冲突处理 电商App的首页通常都支持下拉刷新&#xff0c;比如京东首页的头部轮播图一直顶到系统的状态栏&#xff0c;并且页面下拉到顶后&#xff0c;继续下拉会拉出带有下拉刷新字样的布局&#x…

leaflet教程039: 只显示一屏地图,设定范围不让循环延展

第039个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet只显示一屏地图,并且根据maxBounds和bounds的设定,来改变不同的地图呈现状态。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共68行)心得总结相…

[附源码]java毕业设计期刊在线投稿平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

小程序基础原理

前言 本文会围绕小程序的基础原理进行介绍。主要包括小程序的基础结构、编译、加载、通讯等几个方面。旨在阅读完毕后可以对小程序有一个基本的印象。 一、基础 对于用户来讲&#xff0c;小程序无需下载、用完即走、体验良好。 对于开发者来讲&#xff0c;小程序主要是区别…

同花顺_代码解析_技术指标_M

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 MACD MACDFS MARSI MASS MAVOL MCL MCO MFI MI MICD MIKE MTM MTMFS MACD 指数平滑异同平均线 MACD指标说明 MACD指数平滑异同移动平均线为两条长、短的平滑平均线。 其…

拉取多CPU架构容器镜像推送到其他仓库

一、背景 一个docker镜像可能会有多种CPU架构的变体&#xff0c;有时需要把这些多架构的镜像全部从公共镜像库&#xff08;如&#xff1a; hub.docker.com &#xff09;同步到自建的库上。 二、解决方法 使用 docker buildx 多架构打包机制&#xff0c;进行重制推送&#xf…

Bean 作用域和生命周期

一 : Bean的默认作用域 Bean 默认情况下是单例状态(singleton),所有人使用的都是同一个对象.举例理解Bean的单例状态 : 假设现在有一个公共的 Bean&#xff0c;提供给 A 用户和 B 用户使用&#xff0c;然而在使用的途中 A 用户却“悄悄”地修 改了公共 Bean 的数据&#xff0…

[附源码]SSM计算机毕业设计中医药系统论文2022JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

快速清除PPT缓存文件或C盘隐藏大文件

是否遇到过电脑的磁盘空间越来越满&#xff0c; 请注意这些临时文件可谓是C盘的存储杀手&#xff0c;无形中吞噬掉很多磁盘空间&#xff0c;这里以PPT为例&#xff1a; C:\Users\Admin\AppData\Roaming\Microsoft\PowerPoint\ 1.首先在PPT2019软件中&#xff0c;打开一个PPT文…

实现BIO多客户端通讯模式

实现BIO多客户端通讯模式背景思想实现服务端线程类服务端客户端结果背景 如果服务端需要处理很多个客户端的消息通信请求应该如何处理呢&#xff0c;此时我们就需要在服务端引入线程了&#xff0c;也就是说客户端每发起一个请求&#xff0c;服务端就创建一个新的线程来处理这个…

PyTorch搭建基于图神经网络(GCN)的天气推荐系统(附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言~~~ 一、背景 极端天气情况一直困扰着人们的工作和生活。部分企业或者工种对极端天气的要求不同&#xff0c;但是目前主流的天气推荐系统是直接将天气信息推送给全部用户。这意味着重要的天气信息在用户手上得不到筛选&#xff0c;…

(C语言)背答案

[#4练习赛]背答案 题目描述 传智专修学院“Java程序设计”的期末考试来源于一个选择库&#xff0c;共有 nnn 道题目&#xff0c;每道题目由问题和答案组成&#xff0c;都是一个字符串&#xff0c;保证所有题目题面互不相同。这个题库已经发给同学进行备考准备。 正式考试中&…

Labview+STM32无线温湿度采集

一.介绍 该项目采用正点原子的STM32ZET6精英板DHT11温湿度模块泽耀科技的无线串口作为下位机&#xff0c;Labview无线串口作为上位机读取下位机发来的数据并处理。 泽耀科技的产品是我在开发过程中经常用到的&#xff0c;他们不仅产品做的非常不错&#xff0c;而且资料齐全售后…

远离cmd,拥抱powershell

简介&#xff1a;cmd命令提示符是在操作系统中&#xff0c;提示进行命令输入的一种工作提示符。在不同的操作系统环境下&#xff0c;命令提示符各不相同。 在windows环境下&#xff0c;命令行程序为cmd.exe&#xff0c;是一个32位的命令行程序&#xff0c;微软Windows系统基于W…

动态规划--区间dp

区间dp题目列表&#xff1a;(1)石子合并(2)环形石子合并(3)能量项链(4)加分二叉树(5)凸多边形的划分(6)棋盘分割题目列表&#xff1a; (1)石子合并 在复习石子合并之前&#xff0c;为了直接进入专题“区间dp“&#xff0c;做一个区间dp的基础题&#xff0c;这个题目具有代表性…

1.2 Android 5.0 的特点

和其他版本相比&#xff0c; Android 5.0 的突出特性如下所示。 &#xff08;1&#xff09;全新的 Material 界面设计 Android 5.0 Lollipop 界面设计的灵感来源于自然、 物理学 以及基于打印效果的粗体、图标化的设计&#xff0c;换句话说&#xff0c;它的设 计是一种基于高品…

智慧建筑BIM解决方案-最新全套文件

智慧建筑BIM解决方案-最新全套文件一、建设背景为什么要发展智慧建筑二、思路架构三、建设方案智慧建筑建设时应考虑下面3个方面&#xff1a;1、减少耗能&#xff0c;促进资源利用效率2、优化工作和生活环境3、确保运营安全可靠四、获取 - 智慧建筑BIM全套最新解决方案合集一、…

m超外差单边带接收机的simulink仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 超外差是利用本地产生的振荡波与输入信号混频&#xff0c;将输入信号频率变换为某个预先确定的频率的方法。这种方法是为了适应远程通信对高频率、弱信号接收的需要&#xff0c;在外差原…