#include<iostream>
#include<cstring>
#pragma once
//循环队列
class CircleQueue
{
public:
CircleQueue(int size = 20); //构造函数
~CircleQueue(); //析构函数
CircleQueue(const CircleQueue &src); //自定义构造函数(避免浅拷贝)
void operator=(const CircleQueue &src); //自定义赋值函数(避免浅拷贝)
void addQue(int val); //入队
void delQue(); //出队
int front(); //返回队头元素
int back(); //返回队尾元素
bool empty(); //判断队空
bool full(); //判断队满
void print();//打印函数
private:
int *_pQue;
int _size;
int _front;
int _rear;
void resize()
{
int *_pMQue = new int[_size * 2];
if (_size<_rear)
{
memcpy(_pMQue, _pQue + _front, sizeof(int)*(_size - _front));
memcpy(_pMQue + (_size - _front), _pQue, sizeof(int)*(_rear - _size));
_rear = _rear - _front;
_front = 0;
}
else
{
memcpy(_pMQue, _pQue, sizeof(int)*(_rear));
}
_size *= 2;
delete[]_pQue;
_pQue = _pMQue;
}
};
1
实现方法CircleQueueFun.cpp
#include "CircleQueue.h"
#include<iostream>
using namespace std;
CircleQueue::CircleQueue(int size)
{
_pQue = new int[size];
_size = size;
_front = 0;
_rear = 0;
}
CircleQueue::~CircleQueue()
{
delete[]_pQue;
_pQue = NULL;
}
CircleQueue::CircleQueue(const CircleQueue &src)
{
_pQue = new int[src._size];
if (src._size<src._rear) //表示循环队列中有循环发生
{
memcpy(_pQue, src._pQue + src._front, sizeof(int)*(src._size - src._front)); //先拷贝目前队列中处于非循环位置上元素
memcpy(_pQue + (src._size - src._front), src._pQue, sizeof(int)*(src._rear - src._size));//拷贝目前队列中处于循环位置上的元素
_size = src._size;
_front = 0;
_rear = src._rear - src._front;
}
else
{
memcpy(_pQue, src._pQue, sizeof(int)*(src._rear));
_size = src._size;
_front = src._front;
_rear = src._rear;
}
}
void CircleQueue::operator=(const CircleQueue &src)
{
if (this == &src)
{
return;
}
delete[]_pQue;
_pQue = new int[src._size];
if (src._size<src._rear)
{
memcpy(_pQue, src._pQue + src._front, sizeof(int)*(src._size - src._front));
memcpy(_pQue + (src._size - src._front), src._pQue, sizeof(int)*(src._rear - src._size));
_size = src._size;
_front = 0;
_rear = src._rear - src._front;
}
else
{
memcpy(_pQue, src._pQue, sizeof(int)*(src._rear));
_size = src._size;
_front = src._front;
_rear = src._rear;
}
}
void CircleQueue::addQue(int val)
{
if (full())
{
resize();
}
_pQue[(_rear) % _size] = val;
_rear++;
}
void CircleQueue::delQue()
{
if (empty())
{
return;
}
_front++;
}
int CircleQueue::front()
{
return _pQue[_front];
}
int CircleQueue::back()
{
return _pQue[_rear];
}
bool CircleQueue::empty()
{
return (_rear - _front) == 0;
}
bool CircleQueue::full()
{
return (_rear - _front) == _size;
}
void CircleQueue::print()
{
for (int i = _front; i <_rear; i++)
{
if (i >= _size)
{
cout << _pQue[i%_size] << "\t";
}
else
{
cout << _pQue[i] << "\t";
}
if ((i - _front + 1) % 5 == 0)
cout << endl;
}
cout << endl;
}
测试函数
/*
** 题目:实现循环队列
**注意点:扩容,拷贝队列时需要注意两种特殊情况的发生
*/
#include<iostream>
#include<cstring>
#include "CircleQueue.h"
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
cout << "循环队列基本操作" << endl;
CircleQueue circlequeue(5); //构造函数
srand((unsigned)time(NULL));
for (int i = 0; i < 5; i++)
{
circlequeue.addQue(rand()); //入队函数
}
circlequeue.print(); //打印函数
for (int i = 0; i < 2; i++)
{
circlequeue.delQue(); //入队函数
}
circlequeue.print(); //打印函数
for (int i = 0; i < 5; i++)
{
circlequeue.addQue(rand()); //入队函数
}
circlequeue.print();
cout << "调用自定义拷贝构造函数" << endl;
CircleQueue circlequeueTwo(circlequeue);
circlequeueTwo.print();
cout << "调用自定义赋值函数" << endl;
CircleQueue circlequeueThree(5);
circlequeueThree = circlequeue;
circlequeueThree.print();
for (int i = 0; i < 5; i++)
{
circlequeueThree.addQue(rand()); //入队函数
}
circlequeueThree.print();
return 0;
}
#include<iostream>
using namespace std;
template<class T>
class sq_Queue
{
private:
int mm;
int front;
int rear;
int s;
T*q;
public:
sq_Queue(int);
void prt_sq_Queue();
int flag_sq_Queue();
void ins_sq_Queue(T);
T del_sq_Queue();
} ;
template<class T>
sq_Queue<T>::sq_Queue(int m)
{
mm=m;
front = mm;
rear = mm;
s = 0;
return;
}
template<class T>
void sq_Queue<T>::prt_sq_Queue()
{
int i;
cout<<"front="<<front<<endl;
cout<<"rear="<<rear<<endl;
if(s==0)
{
cout<<"队列空!"<<endl;
return;
}
i=front;
do{
i+=1;
if(i==mm+1) i=1;
cout<<q[i-1]<<endl;
}while(i!=rear);
return;
}
template<class T>
int sq_Queue<T>::flag_sq_Queue()
{
if((s==1)&&rear==front) return -1;
if(s==0) return 0;
return 1;
}
template<class T>
void sq_Queue<T>::ins_sq_Queue(T x)
{
if((s==1)&&rear==front)
{
cout<<"Queue_Overflow"<<endl;
return;
}
rear+=1;
if(rear=mm+1) rear=1;
q[rear-1]=x;
s=1;
return;
}
template<class T>
T sq_Queue<T>::del_sq_Queue()
{
T y;
if(s==0)
{
cout<<"Queue_Underflow"<<endl;
return 0;
}
front+=1;
if(front==mm+1) front=1;
y=q[front-1];
if(front==rear) s=0;
return y;
}
#include<iostream>
using namespace std;
template<class T>
struct node{
T d;
node*next;
};
template<class T>
class linked_List
{
private:
node<T>*head; //定义头指针
public:
linked_List();//初始化表
void prt_linked_List();//扫描输出链表的元素
void ins_linked_List(T,T);//在包含元素x的结点前插入新元素b
int del_linked_List(T);
};
template<class T>
linked_List<T>::linked_List()
{
head=NULL;return; //建立空链表
}
template<class T>
void linked_List<T>::prt_linked_List()
{
node<T>*p;
p=head;
if(p==NULL){cout<<"空链表"<<endl;return;}
do{
cout<<p->d<<endl;
p=p->next;
}while(p!=NULL);
return;
}
template<class T>
void linked_List<T>::ins_linked_List(T x,T b)
{
node<T>*p,*q;
p=new node<T>;
p->d=b;
if(head==NULL)
{
head=p;
p->next=NULL;
return;
}
if(head->d==x)
{
p->next=head;
head=p;
return;
}
q=head;
while((q->next!=NULL)&&(((q->next)->d)!=x))
q=q->next;
p->next=q->next;
q->next=p;
return ;
}
template<class T>
int linked_List<T>::del_linked_List(T x)
{
node<T>*p,*q;
if(head==NULL) return 0;
if((head->d)==x)
{
p=head->next;
delete head;
head=p;
return 1;
}
q=head;
while((q->next!=NULL)&&(((q->next)->d)!=x))
q=q->next;
if(q->next==NULL)return 0;
p=q->next;
q->next=p->next;
delete p;
return 1;
}