常用数据结构之链式存储队列

链式队列的基本运算 本程序共设计了单链表上多项式相加需要的的6个基本操作运算,分别是链式队列的入队,出队,遍历,长度,取队头,以及销毁队列操作。附带实验报告。 立即下载

        与顺序存储结构的队列不同,链式存储可以自由的扩展存储个数。设计时一般使用一个头节点和尾节点。头节点用于入队,尾节点用于出队。

       其结构图如下所示:


     用C++模板类实现的代码如下:

/*
 * =====================================================================================
 *
 *       Filename:  3linkqueue.h
 *
 *    Description:  template implement of link queue
 *
 *        Version:  1.0
 *        Created:  2012年03月13日 20时08分08秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Lavey Luo (lavey), luoyi.smt@gmail.com
 *   Organization:  
 *
 * =====================================================================================
 */
#ifndef __LINK_QUEUE_H__
#define __LINK_QUEUE_H__

/*
 *    front         e1                       en
 *    ---------    ----------               ---------- 
 *   |    |---|--->|    |---|----> .......> |    |   |     
 *   |    |   |    |    |   |               |    |   |
 *    ---------    ----------               ---------- 
 *                                             rear
 */
namespace st
{
#ifndef _STATUS_CONST_
#define _STATUS_CONST_
	enum Status
	{
		OK = 0, 
		ERROR = -1
	};
#endif
	template<class T> class linkqueue;
	template<class T>
		class queuenode
		{
			friend class linkqueue<T>;
			T data;
			queuenode* next;
		};
	template<class T>
		class linkqueue
		{
			public: 
				explicit linkqueue():front(0), rear(0), len(-1){};
				~linkqueue(){};
			public:
				/* 构造一个空队列Q */
				Status Init();

				/* 求队列的长度 */
				int Length();

				/* 销毁队列 */
				Status Destroy();

				/* 将为空队列 */
				Status Clear();

				/* 若空队列,则返回TRUE,否则返回FALSE */
				Status Empty();

				/* 若队列不空,则用e返回队头元素,并返回OK,否则返回ERROR */
				Status GetHead(T*e);

				/* 插入元素e为新的队尾元素 */
				Status EnQueue(T e);

				/* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */
				Status DeQueue(T*e);
			private:
				queuenode<T>* front; 
				queuenode<T>* rear; 
				int len;
		};
	template<class T>
		Status linkqueue<T>::Init()
		{
			if (len != -1 && front != 0 && rear != 0 )
				return ERROR;

			front =  rear = new queuenode<T>;
			len = 0;
			return OK;
		}
	
	template <class T>
		int linkqueue<T>::Length()
		{
			return len;
		}

	template <class T>
		Status linkqueue<T>::Destroy()
		{
			if (len == -1)
				return ERROR;
			
			while (len >0 || front != rear)
			{
			  queuenode<T>* p =  front->next;	
				front->next = p->next;
				if (!p->next)
					rear = front;
				delete p;
				len --;
			}
			len = -1;
			delete front;
			return OK;
		}

	template <class T>
		Status linkqueue<T>::Clear()
		{
			if (len == -1)
				return ERROR;
			
			while (len > 0 || front != rear)
			{
			  queuenode<T>* p =  front->next;	
				front->next = p->next;
				if (!p->next)													/* 若为最后一个元素则调整rear=front */
					rear = front;
				delete p;
				len --;
			}
			return OK;
		}

	template <class T>
		Status linkqueue<T>::Empty()
		{
			if (len == 0)
				return OK;
			return ERROR;
		}

	template <class T>
		Status linkqueue<T>::GetHead(T *e)
		{
			if (len < 0 || !front)
				return ERROR;

			*e = front->next->data;                   /* 返回第一个元素的值 */
			return OK;
		}

	template <class T>
		Status linkqueue<T>::EnQueue(T e)
		{
			if (len < 0 || !front)
				return ERROR;
		
				queuenode<T>* p = new queuenode<T>;
				if (!p)
					return ERROR;	
				p->data = e;
				p->next = 0;
				rear->next = p;                         /* 调整rear的位置指向 */
				rear = p;
				len ++;
				return OK;
		}

	template <class T>
		Status linkqueue<T>::DeQueue(T* e)
		{
			if (len < 0 || front == rear)             /* 空队列 */
				return ERROR;

			queuenode<T> *p = front->next;
			front->next = p->next;                    /* 调整front指向的元素位置 */
			if (!p->next)                             /* 若为最后一个元素则调整rear=front */
				rear = front;
			*e = p->data;
			delete p;
			len --;
			return OK;
		}
}
#endif // __LINK_QUEUE_H__


     测试用列如下:

/*
 * =====================================================================================
 *
 *       Filename:  test_linkqueue.cpp
 *
 *    Description:  test case of the linkqueue
 *
 *        Version:  1.0
 *        Created:  2012年03月13日 21时14分11秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Lavey Luo (lavey), luoyi.smt@gmail.com
 *   Organization:  
 *
 * =====================================================================================
 */
#include "3linkqueue.h"
#include <stdio.h>

int test_linkqueue(int argc,  char** argv)
{
	st::linkqueue<int> lq;
	if (lq.Init() == st::OK)
		printf("成功地构造了一个空队列!\n");
	else
		return -1;

	printf("是否空队列?%d(0:空 -1:否)  ",lq.Empty());
	printf("队列的长度为%d\n", lq.Length());
	lq.EnQueue(-5);
	lq.EnQueue(5);
	lq.EnQueue(10);
	printf("插入3个元素(-5,5,10)后,队列的长度为%d\n",lq.Length());
	
	int d = 0;
	int i = lq.GetHead(&d);
	if(i==st::OK)
	 printf("队头元素是:%d\n",d);

	lq.DeQueue(&d);
	printf("删除了队头元素%d\n",d);
	i = lq.GetHead(&d);
	if(i== st::OK)
		printf("新的队头元素是:%d\n",d);

	lq.Clear();
	printf("清空队列后,len:%d\n",lq.Length());

	printf("销毁队列\n");
	lq.Destroy();

	return 0;
}


链式队列的实现 该文件实现链式队列功能,包含队列的创建queucreat、入队add与出队output,并通过打印显示函数的执行效果。 立即下载

相关推荐

vscode远程连接deepin出错:过程试图写入的管道不存在的解决方法

背景:昨天我用vscode使用ssh远程开发还处于正常状态,今天刚打开电脑,并启动deepin,再次使用vscode重新连接就出现异常。意思就是22号默认端口连接被拒绝,所以要先确定ssh是否连接。3.重新进入vscode里面,重新连接,如图成功连接。,查看port后面的端口号是不是22号。1.检查sshd是否启动。

qq_43573047的博客 2948

数据结构之队列(链式队列)的基本操作与实现

这篇文章的末尾有完整的实现代码,书写不易,转载请附上本文章链接。 一、链式队列的概念 何为链式队列,想到链式队列大家应该都会想到顺序表的单链表的基本操作,我们来对比一下:单链表是用一个头指针或者是尾指针来实现元素的插入和删除等,即头插法和尾插法。而链式队列呢,我们都知道队列是一个在队首进行出队再队尾进行入队,而不是在一段完成任务,所以我们这里就需要两个指针分别指向队列的头front和尾rear,他们两个各司其职,当要进行出队操作时,头指针front说了算,当要进行入队操作时,尾指针re...

BaoITcore的博客 2万+

RK3566 Android11固件烧录实战:从驱动配置到分区升级与救砖

在嵌入式开发与量产交付中,固件烧录是连接编译产物与硬件实体的关键环节,其本质并非简单的文件拷贝,而是依赖芯片BootROM与Loader协同完成的分区级数据搬运。以RK3566平台为例,理解Loader模式、MaskROM模式以及Android分区表的映射关系,是高效开展系统升级、单分区调试和异常恢复的基础。无论是研发阶段通过RKDevTool进行灵活的分区烧录,还是产线环境借助Linux命令行工具实现批量灌装,规范的驱动安装、工具链选型与硬件连接验证都直接决定成败。本文聚焦RK3566 Android11

weixin_29172963的博客 253

【数据结构】队列的基础知识

本文主要介绍了队列的基础知识:循环队列、链队,以及相应的代码案例,便于理解。

The_bad的博客 683

避坑实录:用certificate-manager重置vCenter 6.7证书时遇到的三个致命陷阱

本文详细解析了使用certificate-manager重置vCenter 6.7证书时可能遇到的三大致命陷阱,包括进度卡在85%的服务启动僵局、脚本突然退出的静默杀手以及密码错误锁死的隐藏机制。通过实战验证的解决方案和高级恢复技巧,帮助系统管理员有效避免vCenter环境瘫痪,确保证书更新过程顺利进行。

g5h6i7j的博客 919

从零配置到批量处理:FaceFusion 3.1完整使用指南(含hififace_256模型测试)

本文详细介绍了FaceFusion 3.1的完整使用指南,包括环境配置、模型选择(特别是hififace_256模型的深度测试)以及批量处理技巧。通过AI驱动的脸部替换技术,帮助用户高效实现高质量的面部处理,适用于影视制作、广告设计等多种场景。

weixin_29056865的博客 655

数据结构——链式队列【c语言版】

队列(quque)简称队,只允许在表的一端输入,在表的另一端删除(操作受限制的线性表), 把进行插入的一段叫做队尾(表尾),把进入删除的一端叫做队首或队头(表头)。 队列最主要的特点:先进先出,FIFO(first in first out) 队列有其实有三种:顺序队列、循环队列、链式队列 采用链式存储结构实现的队列称为链队 下面是采用单链表来实现链式队列的过程: 在链队中只允许单链表的表头进行删除操作(出队),表尾进行插入操作(入队),因此需要...

clear-ninghongkang的博客 7384

基于freesurfer和3Dslicer的脑区分割与电极定位全流程解析(实战指南)

本文提供了一套基于FreeSurfer和3D Slicer的颅内电极定位实战指南。详细解析了从环境搭建、数据预处理、FreeSurfer脑区分割、影像配准,到3D Slicer中手动与自动化电极定位的全流程。重点介绍了如何利用FreeSurfer进行高精度脑区分割,并在3D Slicer中实现电极触点的可视化标记与坐标提取,最终获得带脑区信息的电极数据,为iEEG/SEEG研究奠定基础。

banana的博客 300

链式队列的基本操作(详细)

队列的基本操作()链式 ,详细

qq_43346784的博客 8703

边缘计算与产业生态系统

目录 文章目录目录边缘计算产业参与者边缘计算产业生态系统 边缘计算产业参与者 边缘计算领域参与者众多,主流公司以打造生态优势为目标,基于自身服务层级向产业链上下两端进行拓展,目前市场主要参与者有: 系统集成商:在产业头部,具有广泛的能力,可以集成不同生态系统公司的产品,具有一定的全球性属性,在边缘计算领域大多由云服务商、电信运营商担任。 云服务商:具有领先的云技术优势与应用生态体系,同时拥有全球性资源布局与市场资源生态,并渴望成为边缘计算主导者。 电信运营商:具有边缘基础设施优势,以及不可替代的

烟云的计算 2104

打破RK3588 GPIO中断响应延迟的枷锁,开启高效编程

本文针对RK3588芯片在智能安防和工业自动化应用中出现的GPIO中断响应延迟问题展开深入分析。通过硬件原理剖析,发现延迟主要源于中断控制器优先级设置、线路干扰等硬件因素,以及中断处理函数复杂、内核调度延迟等软件问题。提出硬件优化方案包括合理布局布线、电源稳定设计,软件层面则通过精准配置设备树、精简中断处理函数、利用工作队列等内核机制进行优化。测试结果显示,优化后中断响应延迟从50-80ms降至10-20ms,高负载下也能稳定在50ms以内。文章最后展望了AI技术在中断调度中的潜在应用价值。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 364

数据结构——链队列的基本算法

代码主要来源:【数据结构】【清华大学】【严蔚敏】 关于栈和队列的基本操作概括起来主要的内容有以下八种: 构造、销毁 置空、判空 取头、求长 输入、输出 下面的代码包括了基本八种外加一个 Status QueueTraverse(LinkQueue Q,void(*vi)(QElemType))函数 //+++++++++++++++++++...

weixin_30776863的博客 718

Python爬取马蜂窝旅游攻略详细实战指南

马蜂窝是国内非常知名的旅游攻略网站,包含了大量的景点介绍、旅行攻略、游记等信息。爬取马蜂窝的数据对于旅游数据分析、旅游产品推荐等有重要价值。但由于马蜂窝对爬虫有一定的反爬措施,并且页面中大量内容通过JavaScript动态加载,爬虫难度相对较大。本篇博客将带你从零开始,使用Python和相关爬虫技术,逐步实现对马蜂窝旅游攻略内容的高效爬取。并结合实战经验,分析反爬策略,提供科学合理的绕过方案。本文介绍了马蜂窝攻略的结构和抓取难点。演示了静态+动态内容的混合爬取技术。介绍了多线程和异步加速方法。

2201_76125261的博客 588

【数据结构】—— 队列

队列的链式存储结构,队列的顺序存储结构(循环队列)

ElvInR的博客 3011

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据结构:队列

Queue 操作集:创建,进队,出队,判断是否满,是否空 结构:数据,front 队列头,rear队列尾(头尾指针,删除一个元素时front+1,加入一个元素时rear+1),最大容量 思考 Q:如何处理队列假溢出? 线性?? 想象成环状的数组 利用取模操作 rear%数组长度,front%数组长度 Q:如何区分队列有没有满? 方法1:记录当前元素个数 size 方法2:用flag记录最后一个元素...

kkzzjx 213

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

循环顺序队列与链式队列实现

队列是一种先进先出的数据结构,分顺序存储结构和链式存储结构两种。顺序存储结构中广泛使用的是循环队列,也是队列使用中最多的一种。下面将分别实现这两种队列的基本操作。 #include<iostream> using namespace std; const int MaxSize = 100; class queue { public: queue() { front = 0...

chocolate的博客 999

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

数据结构与算法(三):栈与队列

上一篇《数据结构与算法(二):线性表》中介绍了数据结构中线性表的两种不同实现——顺序表与链表。这一篇主要介绍线性表中比较特殊的两种数据结构——栈与队列。首先必须明确一点,栈和队列都是线性表,它们中的元素都具有线性关系,即前驱后继关系。

Java+GO+JS全栈工程师-鹤冲天的博客:编程辅导~商务合作~技术交流 6594

java 自定义队列_Java自定义实现链队列详解

一、写在前面数据结构中的队列应该是比较熟悉的了,就是先进先出,因为有序故得名队列,就如同排队嘛,在对尾插入新的节点,在对首删除节点.jdk集合框架也是提供也一个Queue的接口.这个接口代表一个队列.顺序队列:ArrayBlockingQueue,LinkedBlockingQueue.(上面两种是足色队列)还有一种是ConcurentLinkedQueue。底层的实现由数组合链表两种的,数组的实...

weixin_39791349的博客 244

数据结构—栈和队列

栈是一种只能在一端进行插入或删除操作的线性表。在表中允许进行插入、删除操作的一端称为栈顶。栈顶的当前位置是动态的,由一个称为栈顶指针的位置指示器来指示。表的另一端称为栈底。当栈中没有数据元素时称为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。栈的主要特点是"先进后出",即后进栈的元素先出栈。每次进栈的元素都放在原当前栈顶元素之前成为新的栈顶元素,每次出栈的元素,都是原当前栈顶元素。栈也成为后进先出表。

2303_80188300的博客 1850

入门小白学数据结构与算法(3)——栈和队列

一、 栈——一种数据遵从“后进先出”的线性表 1.1 基本概念: 1.仅限定在表尾(栈顶)进行插入和删除操作 2.把允许插入和删除的一端(表尾)称为栈顶,另一端叫做栈底,不含任何元素的叫做空栈 3.先进的数据放在底,栈的插入又叫入栈,栈的删除叫做出栈。 理解:其实栈就是一种特殊的线性表(顺序表,链表),只是数据的操作只允许在表尾(栈顶) 1.2 存储结构 分为顺序存储和链式存储,常用的为顺序存储 1.3栈的相关代码操作——栈顶栈底指针形式 栈的定义 typedef int Elemtype; typedef

小景的博客 440

栈和队列

栈和队列及其应用栈栈的基本概念栈的基本操作顺序存储Top指向当前位置判断栈空入栈出栈读栈顶元素Top指向下一个插入位置入栈出栈共享栈链式存储结构入栈出栈取栈顶元素栈总结队列队列的基本概念队列的基本操作顺序存储判断队空入队出队循环队列循环队列之判断队空循环队列之入队循环队列之出队链式存储链队入队操作链队出队操作双端队列总结 在这篇文章将介绍数据结构中的栈和队列及它们的常见应用。在之前写过的文章中或者看本文的读者应该知道有两种存储方式,一种是顺序存储,一种是链式存储,本文将通过这两种存储来实现栈和队列。 栈 栈

拿头去拼啊 1304

两顺序栈共享Java_数据结构与算法(三),栈与队列

上一篇《数据结构与算法(二),线性表》中介绍了数据结构中线性表的两种不同实现——顺序表与链表。这一篇主要介绍线性表中比较特殊的两种数据结构——栈与队列。首先必须明确一点,栈和队列都是线性表,它们中的元素都具有线性关系,即前驱后继关系。目录:一、栈1、基本概念2、栈的顺序存储结构3、两栈共享空间4、栈的链式存储结构5、栈的应用——递归二、队列1、基本概念2、队列的顺序存储结构3、队列的链式存储结构三...

weixin_36423062的博客 343

【DS】4.栈&队列大总结!

栈&队列大总结!

moteandsunlight的博客 802

【408考研】数据结构 —— 第三章 栈、队列

计算机考研全国统考408科目之一 :数据结构, 第三章栈和队列学习笔记。

CS@zeny的博客 995

数据结构与算法分析:栈与队列

以下是对数据结构中的栈和队列的一些总结: 一、栈 栈(Stack)是一种特殊的线性表,有后进先出(Last In First Out, LIFO)的性质,且只能从线性表的一段进行插入和删除元素等操作。 栈的常用操作有:进栈、出栈、取栈顶、将栈置空、判断栈是否为空、判断栈是否已满等等。 由于栈也属于线性表,因此线性表的存储结构对栈也适用,因此,使用数组或者单向链表均可以实现栈

博学笃志-格物明德 1099

数据结构(C#语言版)——栈和队列

栈和队列是计算机中常用的两种数据结构,是操作受限的线性表。栈的插入和删除等操作都在栈顶进行,它是先进后出的线性表。队列的删除、查找等操作在队头进行,而插入操作在队尾进行,它是先进先出的线性表。与线性表一样,栈和队列也有顺序存储与链式存储两种方式。 栈 1: public interface IStack<T> { 2: ...

weixin_30315435的博客 123
上一篇: 常用数据结构之基于数组的循环队列
下一篇: 常用数据结构之链式存储二叉树
freesum
博客等级 码龄20年 20粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值