STL-queue和循环队列基本操作的实现
2018-11-13-17:53:44
1.可增长循环队列
队列是一种特殊的线性表,是一种先进先出(FIFO)的数据结构。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
下面是我用顺序结构实现的可增长循环队列,当队列元素的个数达到QueueSize-1时,队列的最大储存长度会定量增长。
/*********************************************************
循环队列的基本操作的实现。
1.当队列元素的个数达到QueueSize-1时,队列的最大储存长度会定量增长。
mian函数操作:
1.输入一个字符串。
2.输入字符,如果字符为'+'或者'-'则进行入队或者出队操作。
3.每次入队出队后打印出现有的队列。
**********************************************************/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;
#define INITQUEUESIZE 100
#define QUEUEINCREAMENT 40
#define OverFlow -1
typedef char QElemtype;
typedef struct{
QElemtype*Elem;//存放队列元素数组的首地址
int Front,Rear;//储存队头和队尾的位置
int QueueSize;//队列当前的最大储存长度
}Queue;
bool Init_Queue(Queue&Q);
bool Queue_Empty(Queue Q);
bool Queue_Full(Queue Q);
QElemtype Get_Front(Queue Q);
bool Pop(Queue&Q,QElemtype&Elem);
bool Push(Queue&Q,QElemtype Elem);
void PrintQueue(Queue Q);
//main函数内所有数据均为测试数据,读者可根据自己测试方式自行调换 int main()
{
Queue Q;
Init_Queue(Q);
QElemtype Elem;
string s;
cin>>s;
for(int i=;i<s.length();i++){
char c=getchar();
if(c=='+'){
Push(Q,s[i]);
PrintQueue(Q);
}
else if(c=='-'){
if(!Queue_Empty(Q)){
Pop(Q,c);
PrintQueue(Q);
}
else
cout<<"Havn't Elem in this Queue"<<endl<<"Please repeate input:"<<endl;
}
else i--;//如果输入!'+'||!'-'则重新开始此步骤
}
PrintQueue(Q);
}
bool Init_Queue(Queue&Q){
Q.Elem=(QElemtype*)malloc(INITQUEUESIZE*sizeof(Queue));
if(!Q.Elem)
exit(OverFlow);
Q.Front=Q.Rear=;
Q.QueueSize=INITQUEUESIZE;
return true;
} bool Queue_Empty(Queue Q){
if(Q.Front==Q.Rear)
return true;
else
return false;
} int Size_Queen(Queue Q){
return (Q.Rear-Q.Front+Q.QueueSize)%Q.QueueSize;
} bool Queue_Full(Queue Q){
if((Q.Rear+)%Q.QueueSize==Q.Front)
return true;
else
return false;
} QElemtype Get_Front(Queue Q){
if(!Queue_Empty(Q)){
return Q.Elem[Q.Front];
}
} bool Pop(Queue&Q,QElemtype&Elem){
if(!Queue_Empty(Q)){
Elem=Q.Elem[Q.Front];
Q.Front=(Q.Front+)%Q.QueueSize;
return true;
}
return false;
} bool Push(Queue&Q,QElemtype Elem){
if(Queue_Full(Q)){
Q.Elem=(QElemtype*)realloc(Q.Elem,(Q.QueueSize+QUEUEINCREAMENT)*sizeof(QElemtype));
if(!Q.Elem)
exit(OverFlow);
Q.Rear=Q.Front+Q.QueueSize;
Q.QueueSize+=QUEUEINCREAMENT;
}
Q.Elem[Q.Rear]=Elem;
Q.Rear=(Q.Rear+)%Q.QueueSize;
}
void PrintQueue(Queue Q){
QElemtype Elem1,Elem2;
for(int i=Q.Front;i<Q.Rear;i++){
Elem1=Get_Front(Q);
Pop(Q,Elem2);
if(Elem1==Elem2)
cout<<Elem2<<'\t';
}
cout<<"The size of Q is "<<Q.QueueSize<<endl;
if(Queue_Full(Q)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
} /****************************************
Author:CRUEL_KING
Time:2018/11/13
Program name:循环队列的基本操作的实现.cpp
****************************************/
2.STL之Queue队列
C++中通常通过STL模板类定义队列,queue是一个容器适配器,具体而言,他是一个先进先出(FIFO)的数据结构。
头文件:#include<queue>
原型:template< class T, class Container =std::deque<T> > class queue;
如上,这对尖括号中有两个参数,第一个是T,表示队列中存放的数据的类型,比如int,double,或者结构体之类。
第二个参数指明底层实现的容器类型,也就是指明这个栈的内部实现方式,比如vector,deque,list。如果不指明它,默认使用deque(双端队列)。
队列的成员函数和基本操作:
定义一个队列:
queue<char>q;//定义一个数据类型为char变量名为q的队列
back()返回最后一个元素:
q.back();//访问最后被压入队列的元素。
empty()如果队列空则返回真:
q.empty();//当队列空时,返回true。
front()返回第一个元素:
q.front();//访问队列的第一个元素。
pop()删除第一个元素:
q.pop();// 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
push()在末尾加入一个元素:
q.push(x); //将x 接到队列的末端。
size()返回队列中元素的个数:
length=q.size();//将q队列的元素个数赋值给一个变量length。
STL-queue和循环队列基本操作的实现的更多相关文章
- [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)
循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...
- Leetcode622.Design Circular Queue设计循环队列
设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器". 循环队列的一个好处是 ...
- STL中的单向队列queue
转载自:http://blog.csdn.net/morewindows/article/details/6950917 stl中的queue指单向队列,使用时,包含头文件<queue>. ...
- [Swift]LeetCode622. 设计循环队列 | Design Circular Queue
Design your implementation of the circular queue. The circular queue is a linear data structure in w ...
- Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较
判断括号是否匹配:调用java本身 import java.util.Stack; public class Solution { public boolean isValid(String s){ ...
- java数据结构——队列、循环队列(Queue)
每天进步一点点,坚持就是成功. 1.队列 /** * 人无完人,如有bug,还请斧正 * 继续学习Java数据结构————队列(列队) * 队列和栈一样,都是使用数组,但是队列多了一个队头,队头访问数 ...
- LeetCode 622:设计循环队列 Design Circular Queue
LeetCode 622:设计循环队列 Design Circular Queue 首先来看看队列这种数据结构: 队列:先入先出的数据结构 在 FIFO 数据结构中,将首先处理添加到队列中的第一个元素 ...
- C#LeetCode刷题之#622-设计循环队列(Design Circular Queue)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4126 访问. 设计你的循环队列实现. 循环队列是一种线性数据结构 ...
- STL - queue(队列)
Queue简介 queue是队列容器,是一种"先进先出"的容器. queue是简单地装饰deque容器而成为另外的一种容器. #include <queue> queu ...
随机推荐
- <基础> PHP 数据类型
PHP三大数据类型 标量 字符串 单引号:不能解析变量 效率高 双引号 :可以解析变量 效率稍微低一些 heredoc : 大文本 整形 浮点 不能用于比较运算 布尔 复合 数组 超全局数组 ...
- Mysql 视图使用
视图 简单理解视图就是一张虚拟表,可以简化一些复杂查询语句 举个简单的例子来理解视图 视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询:不包含任何列或数据.使用视图可以简化复杂 ...
- Django--views(视图层)
路径匹配后-----传给视图函数 一.视图函数 视图层,熟练掌握两个对象即可:请求对象(request)和响应对象(HttpResponse) 一个视图函数,简称视图,是一个简单的Python 函数, ...
- 使用大于16TB的ext4文件系统
我们的电脑想要快速开机,需要具备三个条件:第一是主板支持UEFI,二是系统支持UEFI(Win8),最后就硬盘需要采用GPT分区. GPT分区全名为Globally Unique Identifier ...
- NETIF_F_LLTX 的属性
在bond初始化的时候,我们可以看到如下属性: /* don't acquire bond device's netif_tx_lock when transmitting */ bond_d ...
- serclet监听器
1:监听servlet上下文 2:监听会话 3:监听请求 使用,必须是实现对应的接口,然后在web.xml中配置自己写的监听器的实现类 过滤器之后,servlet之前(有待深入研究) 下一集预告:过滤 ...
- centos FTP 用户指定目录禁用上级目录
在默认配置下,本地用户登入FTP后可以使用cd命令切换到其他目录,这样会对系统带来安全隐患.可以通过以下三条配置文件来控制用户切换目录.chroot_list_enable=YES/NO(NO)设置是 ...
- javascript 中Array.prototype.sort 函数的用法
来源:http://www.jb51.net/article/5769.htm JavaScript中对变量的操作都是通过引用方式,而对数组也一样. 前两天想要对一个数组进行复制,一直苦于找不到办法( ...
- eclipse git 删除内容
- C# CefSharp MemoryStreamResponseFilter这个类使用过程中遇到的bug,dataIn.CopyTo(dataOut)异常
使用这个类,可以获取请求的所有数据,可用来下载网站的图片.js等 cef给出的源码 dataIn.CopyTo(dataOut);这句代码,有时候会有问题.问题是这个:dataIn.length 会大 ...