循环队列、双端队列 C和C++

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

队列

目录

概念

实现方式

顺序队列

循环队列

队列的数组实现

用循环链表实现队列

STL 之 queue 实现队列 

STL 之 dequeue 实现双端队列 


概念

队列是一种特殊的线性表,它只允许在表的前端(称为队头,front)进行删除操作——出队,而在表的后端(称为队尾,rear)进行插入操作——入队,是一种操作受限的线性表。

最先进入队列的元素最先被删除,是“先进先出”的线性表。

实现方式

  • 数组
  • 链表
  • C++ 中可以使用 STL 中的 queue 实现
  • 其中 STL 中还包括双端队列 dequeue

顺序队列

必须静态分配或者动态申请空间,并设置两个指针管理,一个是队头指针 front(指向队头元素),另一个是队尾指针 rear(指向下一个入队元素的存储位置)。

队空的判断条件是:front==rear,队满的条件为:rear==MAXQSIZE。

循环队列

为了使队列空间可以重复使用,可以对循环队列进行改进,无论是插入或者删除,一旦 rear 指针或者 front 指针超出了所分配的队列空间,就让它指向这篇连续空间的起始位置,自己从 MAXQSIZE 增 1 变为 1,可以用取余运算实现: (rear+1)%MAXQSIZE、 (front+1)%MAXQSIZE.

其中队空的判断条件为:front==rear,队满的条件为:(rear+1)%MAXQSIZE==front。

队列的数组实现

定义一个结构体实现队列:

struct node {
	int* data;
	int front;
	int rear;
};

初始化队列:(将队头和队尾指针都赋为 1),数组长度为 MAXQSIZE,开辟一块空间为 MAXQSIZE-1 的数组:

//为队列开辟空间并初始化(也可以在结构体中定义int data[MAXQSIZE])
void InitQueue(struct node& Q) {
	Q.rear = 1;
	Q.front = 1;
	Q.data = (int*)malloc(MAXQSIZE+1 * sizeof(int));
}

入队:

//入队
int EnQueue(struct node &Q,int y) {
	if (Q.rear != MAXQSIZE) {
		Q.data[Q.rear] = y;
		Q.rear++;
		return 1;
	}
	return 0;
}

出队:

//出队
int DeQueue(struct node& Q, int &y) {
	if (Q.rear != Q.front)
	{
		y = Q.data[Q.front];
		Q.front++;
		return 1;
	}
	return 0;
}

总代码为:

//数组实现队列
#include<stdio.h>
#include<stdlib.h>
#define MAXQSIZE 100
int queue[MAXQSIZE];
struct node {
	int* data;
	int front;
	int rear;
};
//为队列开辟空间并初始化(也可以在结构体中定义int data[MAXQSIZE])
void InitQueue(struct node& Q) {
	Q.rear = 1;
	Q.front = 1;
	Q.data = (int*)malloc(MAXQSIZE+1 * sizeof(int));
}
//入队
int EnQueue(struct node &Q,int y) {
	if (Q.rear != MAXQSIZE) {
		Q.data[Q.rear] = y;
		Q.rear++;
		return 1;
	}
	return 0;
}
//出队
int DeQueue(struct node& Q, int &y) {
	if (Q.rear != Q.front)
	{
		y = Q.data[Q.front];
		Q.front++;
		return 1;
	}
	return 0;
}
int main() {
	int n;
	int x, y;
	struct node Q;
	InitQueue(Q);
	//以1开头为插入(插入操作输入两个数),以0开头为删除
	printf("输入操作个数:(以1开头为插入(插入操作输入两个数),以0开头为删除)\n");
	scanf("%d", &n);
	while (n--) {
		printf("输入操作:");
		scanf("%d", &x);
		if (x == 1)
		{
			scanf("%d", &y);
			if (EnQueue(Q, y))
				printf("入队成功\n");
			else
				printf("入队失败\n");
		}
		else if (x == 0)
		{
			if (DeQueue(Q, y) == 0)
				printf("出队失败\n");
			else
				printf("出队的元素为:%d\n",y);
		}
		else
		{
			printf("输入正确的操作\n");
			n++;
		}
	}
	return 0;
}

用循环链表实现队列

不用循环时将初始化时的 Q->next=Q 删去。

以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,不设头指针。

定义一个结构体:

struct node {
	int data;
	struct node* next;
};

入队:

//入队
void EnQueue(struct node* Q, int y) {
	struct node* p;
	p = (struct node*)malloc(sizeof(struct node));
	p->data = y;
	p->next = Q->next;
	Q->next = p;
	Q = p;
}

出队:

//出队
int DeQueue(struct node* Q, int& y) {
	if (Q->next == Q)
		return 0;
	struct node* p;
	p = Q->next;
	y = p->data;
	Q->next = p->next;
	free(p);
	return 1;
}

总代码:

//以带头结点的循环链表表示队列,
//并且只设一个指针指向队尾结点,不设头指针。
#include<stdio.h>
#include<stdlib.h>
struct node {
	int data;
	struct node* next;
};
//循环队列的初始化
void InitQueue(struct node* Q) {
	Q->next = Q;//初始化循环队列
}
//入队
void EnQueue(struct node* Q, int y) {
	struct node* p;
	p = (struct node*)malloc(sizeof(struct node));
	p->data = y;
	p->next = Q->next;
	Q->next = p;
	Q = p;
}
//出队
int DeQueue(struct node* Q, int& y) {
	if (Q->next == Q)
		return 0;
	struct node* p;
	p = Q->next;
	y = p->data;
	Q->next = p->next;
	free(p);
	return 1;
}
int main() {
	struct node* Q;
	Q = (struct node*)malloc(sizeof(struct node));
	InitQueue(Q);
	printf("输入操作个数:(以1开头为插入(插入操作输入两个数),以0开头为删除)\n");
	int x, y, n;
	scanf("%d", &n);
	while(n--)
	{
		printf("输入操作:");
			scanf("%d", &x);
		if(x==1)
		{
			scanf("%d", &y);
			EnQueue(Q, y);
			printf("入队成功\n");
		}
		else if(x==0)
		{
			if (DeQueue(Q, y) == 1)
				printf("%d\n", y);
			else
				printf("出队失败\n");
		}
	}
	return 0;
}
 

STL 之 queue 实现队列 

要加上头文件:#include<queue>

对应的函数:
循环队列、双端队列 C和C++

构造空队列:

queue<int>q;

总代码: 

//用queue函数实现队列
#include<iostream>
#include<queue>
using namespace std;
int main() {
	queue<int>q;
	int n;
	int x, y;
	printf("输入操作个数:");
	scanf("%d", &n);
	printf("以1开头为插入(插入操作输入两个数),以0开头为删除\n");
	while (n--) {
		scanf("%d", &x);
		if (x == 1) {
			scanf("%d", &y);
			q.push(y);
		}
		else if(x==0){
			if (!q.empty()) {//判断队列不为空
				printf("%d\n", q.front());
				q.pop();
			}
			else
				printf("出队失败\n");
		}
		else{
			printf("输入正确的操作\n");
			n++;
		}
		printf("队列中元素个数为:%d\n", q.size());
	}
	return 0;
}

STL 之 dequeue 实现双端队列 

循环队列、双端队列 C和C++文章来源地址https://www.toymoban.com/news/detail-408913.html

//用dequeue实现双端队列
#include<iostream>
#include<deque>
using namespace std;
struct node {
	int *data;
}Q;
int main() {
	deque<int>q(10);
	deque<int>::iterator idex;
	for (int i = 0; i < 10; i++) {
		q[i] = i;
	}
	for (int i = 0; i < 10; i++) {
		printf("%d ", q[i]);
	}
	printf("\n");

	//在头尾加入新元素
	printf("加入新元素后:\n");
	q.push_back(100);//加入队尾
	q.push_front(10);//加入队头


	printf("输出deque的数据:\n");
	for (idex = q.begin(); idex != q.end(); idex++) {
		printf("%d ", *idex);
	}
	printf("\n");

	//查找
	int x = 5;
	idex = find(q.begin(), q.end(), x);
	if (idex != q.end())
		printf("找到%d元素\n",x);
	else
		printf("队列中没有%d元素\n",x);

	//在头尾删除数据
	q.pop_back();//删除队尾
	q.pop_front();//删除队头

	printf("输出deque的数据:\n");
	for (idex = q.begin(); idex != q.end(); idex++) {
		printf("%d ", *idex);
	}
	return 0;
}

到了这里,关于循环队列、双端队列 C和C++的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 1109 Group Photo(40行代码+超详细注释+题目分析,双端队列实现)

    分数 25 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 Formation is very important when taking a group photo. Given the rules of forming K rows with N people as the following: The number of people in each row must be N/K (round down to the nearest integer), with all the extra people (if any) standing in the last row; All the

    2024年02月07日
    浏览(112)
  • 【C++】【数据结构】循环队列的基本操作(初始化、入队、出队、取队头元素、遍历输出队列、求队列长度)顺序队列的算法实现【附全代码】

    使用c++完成数据结构循环队列的基本操作,包括(初始化、入队、出队、取队头元素、遍历输出队列、求队列长度等),可直接编译运行。 队列 又称为 “先进先出” (FIFO)线性表。限定插入操作只能在队尾进行,而删除操作只能在队首进行。 循环队列 ——采用 顺序存储结构

    2023年04月16日
    浏览(53)
  • 数据结构--队列2--双端队列--java双端队列

    双端队列,和前面学的队列和栈的区别在于双端队列2端都可以进行增删,其他2个都是只能一端可以增/删。 因为2端都需要可以操作所以我们使用双向链表 我们也需要一共头节点 所以节点设置 队列的类维护: 容量 队列元素个数 哨兵 哨兵初始头和尾都指向自己,value为null

    2024年02月10日
    浏览(44)
  • 【数据结构-队列】双端队列

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月09日
    浏览(37)
  • 数据结构--双端队列

    双端队列(Double-ended Queue,简称Deque)是一种具有队列和栈特性的数据结构,可以在队列的两端进行插入和删除操作。双端队列允许从前端和后端同时进行插入和删除操作,因此可以称为“两端都可以进出的队列”。 双端队列的特点包括: 可以在队列的头部和尾部进行插入和

    2024年02月08日
    浏览(47)
  • 49天精通Java,第27天,队列、双端队列、优先队列

    大家好,我是哪吒。 双端队列是一种特殊的队列,它的两端都可以进行插入和删除操作。这种队列的实现方式是使用两个指针,一个指针指向队列的头部,另一个指针指向队列的尾部。当需要插入或删除元素时,只需要移动指针即可。

    2024年02月03日
    浏览(47)
  • 数据结构与算法-双端队列

    Gitee上开源的数据结构与算法代码库:数据结构与算法Gitee代码库 双端队列、队列、栈对比 定义 特点 队列 一端删除(头)另一端添加(尾) First In First Out 栈 一端删除和添加(顶) Last In First Out 双端队列 两端都可以删除、添加 优先级队列 优先级高者先出队 延时队列 根据

    2024年02月13日
    浏览(40)
  • STL之deque 【双端队列】

    deque :双端队列是 C++ 标准库中的一种容器,它允许高效地从两端添加和删除元素。 deque 是一个动态数组,支持快速随机访问,并且可以在前端和后端高效地执行插入和删除操作。 push_back(value) :在双端队列的末尾插入元素。 push_front(value) :在双端队列的开头插入元素。 p

    2024年01月19日
    浏览(37)
  • STL:双端队列&容器适配器&仿函数&优先级队列

    双端队列可以在头部和尾部进行插入删除操作 与vector相比,头插效率高,不需要搬移元素 与list相比,空间利用率高 deque逻辑上空间是连续的,物理上并不是,是由一段段小空间拼接而成的 双端队列的迭代器比较复杂 cur:指向空间中被遍历的那个元素 first:指向空间开始

    2024年02月16日
    浏览(47)
  • 数据结构:循环队列的实现(leetcode622.设计循环队列)

      目录 一.循环队列简单介绍 二.用静态数组实现循环队列 1.数组循环队列结构设计 2.数组循环队列的堆区内存申请接口  3.数据出队和入队的接口实现 4.其他操作接口 5.数组循环队列的实现代码总览  三.静态单向循环链表实现循环队列  1.链表循环队列的结构设计 2.创建静态

    2024年02月03日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包