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 ...
随机推荐
- js 监听组合键盘事件
有些时候,我们需要在网页上,增加一些快捷按键,方便用户使用一些常用的操作,比如:保存,撤销,复制.粘贴等等. 我们所熟悉的按键有这么集中类型: 单独的按键操作,如:delete.up.down等 两位 ...
- day3 python 阿狸的进阶之路
函数概念: 1.为什要有函数 组织结构不清晰,可读性差,代码冗余,可扩展性差. 2.什么是函数 具备某一个功能的工具--->函数 事先准备工具->函数的定义 拿来就用. ...
- static,final的用法
static的用法:修鉓符,修鉓属性,方法,代码块a1.修鉓属性:该属性是一个静态的属性,叫类的成员(没有static修鉓的属性叫实例的成员,调用时用:对象名.属性),调用:类名.属性.a2.修鉓方法 ...
- jquery左侧菜单
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- cordova- cordova-plugin-splashscreen启动页面和图标的设置
https://www.cnblogs.com/a418120186/p/5856371.html
- 新装kafka与zookeeper配置
zookeeper配置 dataDir=/opt/kafka_2.11-2.0.0/data/zookeeper # 尽量不要放在tmp# the port at which the clients ...
- Spark读取配置(转)
转自:https://github.com/keepsimplefocus/spark-sourcecodes-analysis/blob/master/markdowns/Spark%E8%AF%B ...
- 学习笔记2:postman 的基本使用
1.get 请求 请求接口:http://xx.xx.xx.xx/api/user/stu_info 请求参数:stu_name 请求参数是放在请求 URL 里的,点击 Params添加参数,key ...
- mysql索引小结——高性能mysql
1.索引可以包含一个或者多个列的值,如果索引包含多个列的值,列的顺序很重要,mysql只能高效地使用索引的最左列前缀列. 2.索引是在存储引擎层而非服务器层实现的. 3.B-tree索引的限制: 如果 ...
- servlet编码问题
建议每个servlet都写上 request.setCharacterEncoding("UTF-8")