(002)循环队列的两种C/C++实现
来源:互联网 发布:网络侦探龙帝 编辑:程序博客网 时间:2024/06/15 11:53
(002)循环队列的两种C实现
2014/12/5 by jxlijunhao
这里利用一个数组实现队列,根据队列的特点,利用两种方法来判断队列是否为满,或者为空。
方法1:浪费一个空间来实现,也就是说在有MaxSize个存储空间的情况下,最多只能存储MaxSize-1数据来达到循 环
队列的目的;
要点:1)初始化: 队头 front,队尾rear, front=rear=0;
2)入队操作: 队尾增加1, rear=(rear+1)%MaxSize;
3)出队操作: 队头增加1, front=(front+1)%MaxSize;
4)队列为空的条件:front==rear
5)队列已满的条件:front==(rear+1)%MaxSize;
#ifndef SQ_QUEUE_H#define SQ_QUEUE_H#include<stdio.h>#include<stdlib.h>#define MaxSize 10typedef struct Queue{int *pQueue; //指向队列的指针int front; //队头int rear; //队尾}QUEUE;void initQueue(QUEUE *p) //队列初始化{p->pQueue=(int*)malloc(sizeof(QUEUE)*MaxSize);if (p->pQueue==NULL){printf("分配内存错误\n");exit(0);}p->front=0; //将队头,队尾初始化为0,指向相同的地方p->rear=0; }int isEmpty(QUEUE *p)//判断一个队列是否已经空了{if (p->front==p->rear)return 1; return 0;}int isFull(QUEUE *p) //判断一个队列是否已经满了{if (p->front==(p->rear+1)%MaxSize){return 1;}return 0;}void pushQueue(QUEUE *p,int x) //将一个新的元素插入到队尾{//先判断队列是否已经满了if (isFull(p)){printf("队列已经满,不能向其中插入新的数据%d\n",x);exit(0);}//向队尾插入新元素,并且指针加1p->pQueue[p->rear]=x;p->rear=(p->rear+1)%MaxSize;}int popQueue(QUEUE *p) //删除队头元素{//先判断队列是否已经满了if (isEmpty(p)){printf("队列已经空");exit(0);}//取出队头元素,并且指针加1int x=p->pQueue[p->front];p->front=(p->front+1)%MaxSize;return x;}void printQueue(QUEUE *p) //遍历队列中的元素 {if (isEmpty(p)){printf("队列为空\n");}int tail=p->front;while (p->rear!=tail){printf("%d ",p->pQueue[tail]);tail=(tail+1)%MaxSize;}}#endif
#include "sq_queue.h"int main(){int val;QUEUE p={NULL,0,0};initQueue(&p);for (int i=0;i<MaxSize-1;i++)pushQueue(&p,i);printQueue(&p);printf("\n");val=popQueue(&p);printf("%d\n",val);val=popQueue(&p);printf("%d\n",val);}
方法2:通过标志符来实现
要点:1)初化队列:front=rear=MaxSize
2)入队:检测标志符状态,front=front+1,判断是否需要将其移到队列最前端 front==MaxSize+1,改变标志符
状态
3)出队:检测标志符状态,rear=rear+1, 判断是否需要将其移到队列最前端 rear==MaxSize+1,队列是否为
空
#ifndef SQ_QUEUE_CLASS_H#define SQ_QUEUE_CLASS_H#include<iostream>using namespace std;//定义循环类template<class T>class sq_queue{private:int cap; //容量int front; //队头指针int rear; //队尾指针int flag; //判断队列是否为空,为满的标志位T * Queue; //循环队列存储空间的首地址public:sq_queue(int); //构造函数,建立空循环队列void print_sq_Queue(); //输出队列中的元素int flag_sq_Queue(); //检查循环队列的状态void push_sq_Queue(T); //入队T pop_sq_Queue(); //出队};//构造函数,建立空循环队列template<class T>sq_queue<T>::sq_queue(int m){cap=m;front=m;rear=m;Queue=new T[m];flag=0; //flag=0,队列为空,flag=1,队列已满}//输出队列中的元素template<class T>void sq_queue<T>::print_sq_Queue(){int pos;cout<<"front"<<front<<endl;cout<<"rear"<<rear<<endl;if (flag==0){cout<<"队列为空"<<endl;return;}pos=front;do {pos=pos+1;if (pos==cap+1) pos=1;cout<<Queue[pos-1]<<endl;} while (pos!=rear);}//检查循环队列的状态template<class T>int sq_queue<T>::flag_sq_Queue(){if(flag==1&&front==rear)return -1; //队列已满if(flag==0) return 0; //队列为空return 1; //队列正常}//入队template<class T>void sq_queue<T>::push_sq_Queue(T x){if (flag==1&&front==rear){cout<<"queue_overflow"<<endl;return;}rear=rear+1;if(rear==cap+1) rear=1;Queue[rear-1]=x;flag=1;} //出队template<class T>T sq_queue<T>::pop_sq_Queue(){T x;if (flag==0){cout<<"queue_underflow"<<endl;return 0;}front=front+1;if (front==cap+1)front=1;x=Queue[front-1];if (front==rear) flag=0;return x;}#endif
#include "sq_queue_class.h"int main(){sq_queue<int> q(10);q.print_sq_Queue();q.push_sq_Queue(1);q.push_sq_Queue(2);q.push_sq_Queue(3);q.push_sq_Queue(4);q.push_sq_Queue(5);q.push_sq_Queue(6);q.push_sq_Queue(7);q.push_sq_Queue(8);q.push_sq_Queue(9);q.push_sq_Queue(10);q.push_sq_Queue(11);q.print_sq_Queue();}
0 0
- (002)循环队列的两种C/C++实现
- 循环队列的实现(C语言)
- 循环队列的实现(C语言)
- 【数据结构】循环队列的实现(c++)
- 循环队列的实现(C语言版)
- c 实现的 循环队列
- 循环队列实现(C++)
- C 循环队列实现
- 循环队列 c 实现!!!!
- 【C++】实现循环队列
- 数据结构的C实现_循环队列
- 数据结构循环队列的实现c程序
- c语言循环线性队列的实现
- 数据结构的C实现_循环队列
- 顺序循环队列的c语言实现
- C语言-循环队列的简单实现
- c语言:循环队列的实现
- 循环队列的c语言实现
- CopyOnWriteArraySet
- Topcoder SRM144 div2 1100
- Dynamic Programming 0-1 knapsacks 动态规划之01背包问题
- 微软宣布.NET开发环境将开源 支持三大操作系统
- 在阿里巴巴的那些日子
- (002)循环队列的两种C/C++实现
- IOS上路_01-Win7+VMWare9+MacOSX10.8+XCode4.6.3
- UVa 10970 - Big Chocolate
- PostgreSQL 9.4文档 第1章 入门
- UVA - 10878 Decode the tape
- 图_邻接矩阵
- Java基础——常用API
- Eclipse中debug的一些操作
- 杂谈---潜意识