(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