循环队列和链式队列(C++实现)
循环队列:
1.循环队列中判断队空的方法是判断front==rear,队满的方法是判断front=(rear+1)%maxSize。(我曾经想过为什么不用一个length表示队长,当length==maxSize时队满)原因就是,在频繁的队列操作中,多出一个变量会大量的增加执行时间,所以不如浪费一个数组空间来得划算。
2.用单链表表示的链式队列特别适合于数据元素变动较大的情形,而且不存在溢出的情况。
template<class T>
class SeqQueue{
protected:
T *element;
int front,rear;
int maxSize;
public:
SeqQueue(int sz=){
front=rear=;
maxSize=sz;
element=new T[maxSize];
}
~SeqQueue(){
delete[] element;
}
bool EnQueue(const T& x){//入队
if(isFull()) return false;
element[rear]=x;
rear=(rear+)%maxSize;
return true;
}
bool DeQueue(T& x){//出队
if(isEmpty()) return false;
x=element[front];
front=(front+)%maxSize;
return true;
}
bool getFront(T& x){//获取队首元素
if(isEmpty()) return false;
x=element[front];
return true;
}
void makeEmpty(){//队列置空
front=rear=;
}
bool isEmpty()const{//判断队列是否为空
return (rear==front)?true:false;
}
bool isFull()const{//队列是否为满
return ((rear+)%maxSize==front)?true:false;
}
int getSize()const{
return (rear-front+maxSize)%maxSize;
}
};
测试代码如下:
void menu(){
cout<<"1.入队"<<endl;
cout<<"2.获取队首元素"<<endl;
cout<<"3.出队"<<endl;
cout<<"4.队列置空"<<endl;
cout<<"5.获取队中元素数量"<<endl;
cout<<"6.退出"<<endl;
}
void function(int num,SeqQueue<int> *sq){
switch(num){
int x;
case :
cin>>x;
sq->EnQueue(x);
break;
case :
sq->getFront(x);
cout<<x<<endl;
break;
case :
sq->DeQueue(x);
break;
case :
sq->makeEmpty();
break;
case :
x=sq->getSize();
cout<<x<<endl;
break;
default:
exit();
}
}
int main(int argc, char** argv) {
SeqQueue<int> *sq=new SeqQueue<int>;
int num;
while(true){
menu();
cin>>num;
function(num,sq);
}
delete sq;
return ;
}
之后是链式队列,实现类代码和测试代码如下:
#include <iostream>
using namespace std;
template<class T>
struct LinkNode{
T data;
LinkNode<T> *link;
LinkNode(T& x,LinkNode<T> *l=NULL){
data=x;
link=l;
}
};
template<class T>
class LinkedQueue{
protected:
LinkNode<T> *front,*rear;
public:
LinkedQueue(){
front=rear=NULL;
}
~LinkedQueue(){
makeEmpty();
}
bool enQueue(T& x){
if(front==NULL)
front=rear=new LinkNode<T>(x);
else{
rear=rear->link=new LinkNode<T>(x);
}
return true;
}
bool deQueue(T& x){
if(isEmpty()) return false;
LinkNode<T> *p=front;
x=front->data;
front=front->link;
delete p;
return true;
}
bool getFront(T& x)const{
if(isEmpty()) return false;
x=front->data;
return true;
}
void makeEmpty(){
LinkNode<T> *p;
while(front!=NULL){
p=front;
front=front->link;
delete p;
}
}
bool isEmpty()const{
return (front==NULL)?true:false;
}
int getSize()const{
LinkNode<T> *p;
int count=;
p=front;
while(p!=NULL){
count++;
p=p->link;
}
return count;
}
};
void menu(){
cout<<"1.入队"<<endl;
cout<<"2.获取队首元素"<<endl;
cout<<"3.出队"<<endl;
cout<<"4.队列置空"<<endl;
cout<<"5.获取队中元素数量"<<endl;
cout<<"6.退出"<<endl;
} void function(int num,LinkedQueue<int> *lq){
switch(num){
int x;
case :
cin>>x;
lq->enQueue(x);
break;
case :
lq->getFront(x);
cout<<x<<endl;
break;
case :
lq->deQueue(x);
break;
case :
lq->makeEmpty();
break;
case :
x=lq->getSize();
cout<<x<<endl;
break;
default:
exit();
}
}
int main(int argc, char** argv) {
LinkedQueue<int> *lq=new LinkedQueue<int>;
int num;
while(true){
menu();
cin>>num;
function(num,lq);
}
delete lq;
return ;
}
循环队列和链式队列(C++实现)的更多相关文章
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- 数据结构----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- 队列(链式队列)----C语言
链式队列----用链表实现,链式队列就是一个操作受限的单向链表,如果读者了解单向链表的建立过程,那理解链式队列就很容易了,先回顾一下单向链表的建立过程 (不熟悉单向链表的可以先看看另一片随笔,再回来看 ...
- 顺序队列与链式队列--C语言实现
关于队列,因为我自己在平时使用不多,所以在这里直接将队列的两种存储方式放在一起,作为一篇随笔,这两份代码均可直接运行,亲测.注释写的应该也算比较详细了,就不过多的解释了 顺序队列 #include&l ...
- C ~ 链式队列与循环队列
此处的链式与循环队列可以应用于BFS和树的层序遍历.下面是对其结构和基本操作的程序描述. 1.循环队列 解决循环队列的队空和队满的方法: [1].增加一个参数count,用来记录数组中当前 ...
- 队列(FIFO)—循环队列、队列的链式存储
1 队列的定义 队列是只允许在一端(队尾)进行插入操作,而在另一端(队头)进行删除操作的线性表. 2 队列的特点 1)先进先出是队列最大的特点,是应用中非常常见的模型,例如排队: 2)队列也属于线性表 ...
- c++实验5 顺序/链式队列
链式队列及循环队列 1.循环队列的实现(请采用模板类及模板函数实现) [实现提示] 同时可参见教材p65-p67页的ADT描述及算法实现及ppt)函数.类名称等可自定义,部分变量请加上学号后3位.也可 ...
- 基于python实现链式队列代码
""" 链式存储-队列 linkqueue.py 代码实现 思路: 1.入队, 2.出队, 3.判断空满 """ # 异常类 class Q ...
- 数据结构算法C语言实现(十一)--- 3.4队列的链式表示和实现
一.简介 FIFO. 二.头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@gmail.com date:2016-6-9 note:r ...
随机推荐
- [解读REST] 2.REST用来干什么的?
衔接上文[解读REST] 1.REST的起源,介绍了REST的诞生背景.每当笔者遇到一个新事物的想去了解的时候,总是会问上自己第一个问题,这个新事物是干什么用的?在解释我所理解的REST这个过程中也不 ...
- React 系列教程2:编写兰顿蚂蚁演示程序
简介 最早接触兰顿蚂蚁是在做参数化的时候,那时候只感觉好奇,以为是很复杂的东西.因无意中看到生命游戏的 React 实现,所以希望通过兰顿蚂蚁的例子再学习一下 React. 兰顿蚂蚁的规则非常简单: ...
- Mybatis中接口和对应的mapper文件命名为什么需要一样?
背景: 自己对于Mybatis现阶段只处于会用的阶段,有些问题,自己还是想深入的了解一下.就拿Mybatis的接口文件和mapper文件命名需要一致来开始. 解决: 当我们将接口和mapper文件放在 ...
- phpcms不能批量更新栏目页和内容页
需要给网站根目录更加users用户的写入权限.
- 02Spring Boot配置文件详解
02Spring Boot配置文件详解 文章指导 学习笔记 学习代码 自定义属性 在src/main/java/resources目录下创建一个application.properties或appli ...
- Python----数据预处理
导入标准库 import numpy as np import matplotlib.pyplot as plt import pandas as pd 导入数据集 dataset = pd.read ...
- Linux下网络配置与修改Centos7为列
一.基础知识 手动绑定: 命令 一般是临时的修改,重启后失效,如:ifconfig.route.ip addr等. 修改配置文件 修改文件配置,永久有效,但是可能不能立即生效,需要重启服务 (serv ...
- Java 常见摘要算法——md5、sha1、sha256
目录 摘要算法简介 md5 使用jdk内置方法实现md5加密 使用bc方式实现md5加密 使用cc方式实现md5加密 sha1 使用jdk内置方法实现sha1加密 使用bc方式实现sha1加密 使用c ...
- svg-sprite使用
chainWebpack(config) { config.module .rule('svg') .exclude.add(path.resolve(__dirname,'src/assets/ic ...
- Python——模块——配置模块(ConfigParser)
一.读取 read(filename) 直接读取ini文件内容 sections() 得到所有的section,并以列表的形式返回 options(section) 得到该section的所有opt ...