文档章节

队列-链式(c/c++实现)

 白客C
发布于 10/24 00:05
字数 984
阅读 175
收藏 0

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活中的问题。

队列(链式)实现的三个步骤:

  • 定义所需的功能(LinkQueue.h)
  • 实现功能(LinkQueue.cpp)
  • 调用功能(Queue.cpp)

 按上面的三个步骤我把代码写成三个文件的形式,同时代码都有详细的注释。

LinkQueue.h文件

/*
 *名字:白客C
 *LinkQueue.h
 *时间:2019年10月20日
 *环境:Visual Studio 2019
 */

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1   //不可行
#define OVERFLOW -2    //溢出

typedef int Status;
typedef int ElemType;
typedef struct QNode {
	ElemType data;  //数据域 
	struct QNode *next;  //指针域 
}QNode, *QueuePtr; //Qnode是结点类型,QueuePtr是结点指针类型 
typedef struct 
{ 
	QueuePtr  front;  //队头指针 
	QueuePtr  rear;   //队尾指针 
}LinkQueue;  //链队列类型

//
//初始化队列
Status InitQueue(LinkQueue& Q);

//销毁队列
Status DestroyQueue(LinkQueue& Q);

//清空队列
Status ClearQueue(LinkQueue& Q);

//判断队列是否为空
Status QueueEmpty(LinkQueue Q);

//查看队列的长度
Status QueueLength(LinkQueue Q);

//用e返回Q的队头元素
Status GetHead(LinkQueue Q, ElemType& e);

//插入元素e为Q的新的队尾元素
Status EnQueue(LinkQueue& Q, ElemType e);

//删除Q的队头元素,并用e返回其值
Status DeQueue(LinkQueue& Q, ElemType& e);

//遍历队列 
Status QueueTraverse(LinkQueue Q);



LinkQueue.cpp文件

/*
 *名字:白客C
 *LinkQueue.cpp
 *时间:2019年10月20日
 *环境:Visual Studio 2019
 */
#include "LinkQueue.h"
#include <iostream>

Status InitQueue(LinkQueue& Q)
{
	Q.front = Q.rear = new QNode; 
	Q.front->next = NULL;//或Q.rear->next=NULL 
	return OK;
}

Status DestroyQueue(LinkQueue& Q)
{
	ClearQueue(Q);
	delete Q.front;
	return OK;
}

Status ClearQueue(LinkQueue& Q)
{
	if (Q.front == Q.rear)
	{
		return ERROR;
	}
	QueuePtr p = NULL;
	while (Q.front->next)
	{
		p = Q.front->next;
		Q.front->next = p->next;
		delete p;
	}
	Q.front->next = NULL;
	return OK;
}

Status QueueEmpty(LinkQueue Q)
{
	return !(Q.front->next);
}

Status QueueLength(LinkQueue Q)
{
	if (Q.front == Q.rear)
	{
		return ERROR;
	}
	int i = 0;
	QueuePtr p;
	p = Q.front->next;
	while (p)
	{
		p = p->next;
		i++;
	}
	return i;
}

Status GetHead(LinkQueue Q, ElemType& e)
{
	if (Q.front == Q.rear)
	{
		return ERROR;
	}
	e = Q.front->data;
	return OK;
}

Status EnQueue(LinkQueue& Q, ElemType e)
{
	QueuePtr s;
	s = new QNode; 
	s->data = e;   
	s->next = NULL; 
	Q.rear->next = s;    
	Q.rear = s; 
	return OK;
}

Status DeQueue(LinkQueue& Q, ElemType& e)
{
	if (Q.front == Q.rear)
	{
		return ERROR;
	}  //空队列 
	QueuePtr p;
	p = Q.front->next;   //p指向队头元素 
	e = p->data;
	Q.front->next = p->next;
	if (p == Q.rear)
	{
		Q.rear = Q.front;
	}
	delete p;
	return OK;
}

Status QueueTraverse(LinkQueue Q)
{
	int i = 0;
	QueuePtr p;
	p = Q.front->next;
	while (p)
	{
		std::cout << p->data;
		p = p->next;
	}
	return OK;
}

Queue.cpp文件

/*
 *名字:白客C
 *Queue.cpp
 *时间:2019年10月20日
 *环境:Visual Studio 2019
 */
#include <iostream>
#include <stdlib.h>
#include "LinkQueue.h"
using namespace std;

int main()
{
	LinkQueue Q;
	int i;
	cout << "0.退出" << endl;
	cout << "1.初始化队列" << endl;
	cout << "2.摧毁队列" << endl;
	cout << "3.清空队列" << endl;
	cout << "4.判断队列是否为空" << endl;
	cout << "5.查看队列的长度" << endl;
	cout << "6.取队列头元素" << endl;
	cout << "7.入队" << endl;
	cout << "8.出队 " << endl;
	cout << "9.遍历" << endl;
	do
	{
		cout << endl << "请选择一个操作:";
		cin >> i;
		switch (i)
		{
		case 1:
			int Init_i;
			Init_i = InitQueue(Q);
			if (Init_i)
			{
				cout << "初始化队列成功" << endl;
			}
			else
			{
				cout << "初始化队列失败" << endl;
			}
			break;

		case 2:
			DestroyQueue(Q);
			cout << "摧毁队列成功" << endl;
			break;

		case 3:
			if (ClearQueue(Q))
			{
				cout << "队列以清空" << endl;
			}
			else
			{
				cout << "队列已经是空的,不需要再次清空" << endl;
			}

			break;

		case 4:
			if (QueueEmpty(Q))
			{
				cout << "是空队列" << endl;
			}
			else
			{
				cout << "不是空队列" << endl;
			}
			break;

		case 5:
			cout << "栈长度为" << QueueLength(Q) << endl;
			break;

		case 6:
			ElemType Get_e;
			GetHead(Q, Get_e);
			cout << "头元素为:" << Get_e;
			break;

		case 7:
			ElemType EnQueue_e;
			cout << "请输入入队元素:";
			cin >> EnQueue_e;
			EnQueue(Q, EnQueue_e);
			cout << EnQueue_e << "已经入队" << endl;
			break;

		case 8:
			ElemType DeQueue_e;
			if (DeQueue(Q, DeQueue_e))
			{
				cout << DeQueue_e << "已经出队" << endl;
			}
			else
			{
				cout << "队列为空元素" << endl;
			}
			break;

		case 9:
			cout << "队列元素:";
			QueueTraverse(Q);
			cout << endl;
			break;

		default:
			break;
		}
	} while (i != 0);
}

 

© 著作权归作者所有

粉丝 0
博文 16
码字总数 15579
作品 0
深圳
程序员
私信 提问
C语言编程基础学习——队列详细讲解!

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/03/20
0
0
C语言编程学习:线性结构的两种常见应用之二:队列

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/05/17
0
0
C语言/C++编程新手入门基础知识整理学习

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/04/01
0
0
一篇C/C++自测试题(不是很难, 附解答)

编辑自一本叫《高质量C/C++编程指南》的书,虽然这些题有错误,而且不大严谨,但我觉得也能一定程度上测试C/C++水平. 我对题目和答案做了非常大幅度的修改,虽然仍存在已知的不严谨之处,但比...

王子亭
2013/01/12
1K
2
有人要我挑战STL 质量, 很简单.

我很多年没有碰C++了, 下面是10年前的代码, 模板来做到数据类型无关, 用于在多个进程当中实现循环链表,用于消息队列. 新的版本,用一个局部对象,来实现锁. 实现这个的目的是在于通过设置固定大...

宏哥
2012/10/12
9.9K
132

没有更多内容

加载失败,请刷新页面

加载更多

Kafka实战(五) - 核心API及适用场景全面解析

1 四个核心API ● Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。 ● Consumer API 允许一个应用程序订阅一个或多个topic ,并且对发布给他们的流式数据进行处...

JavaEdge
今天
11
0
实现线程的第三种方式——Callable & Future

Callable Runnable 封装一个异步运行的任务, 可以把它想象成为一个没有参数和返回值的异步方 法。Callable 与 Runnable 类似, 但是有返回值。Callable 接口是一个参数化的类型, 只有一 个...

ytuan996
今天
12
0
OSChina 周六乱弹 —— 不要摁F了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 : 朴树写的词曲都给人一种莫名的失落感,不过这首歌他自己却没有唱,换成赵传这种高音阶嘶喊的确很好,低沉但却有力,老男人的呐喊...

小小编辑
今天
22
0
Android Binder机制 - interface_cast和asBinder讲解

研究Android底层代码时,尤其是Binder跨进程通信时,经常会发现interface_cast和asBinder,很容易被这两个函数绕晕,下面来讲解一下: interface_cast 下面根据下述ICameraClient例子进行分析...

天王盖地虎626
昨天
13
0
计算机实现原理专题--存储器的实现(二)

计算机实现原理专题--存储器的实现(一)中描述了一种可以记住输入端变化的装置。现需要对其功能进行扩充,我们将上面的开关定义为置位,下面的开关定义为复位,然后需要增加一个保持位,当保...

FAT_mt
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部