废话不多说,上代码
头文件
#ifndef _MYQUEUE__H
#define _MYQUEUE__H
#include <iostream>
using namespace std;
class MyQueue{
private:
int *_myQueue; //存放队列的数组指针
int _head; //队列头
int _tail; //队列尾
int _size; //队列容量
int _len; //队列长度
public:
MyQueue(int size);
~MyQueue();
void clearQueue(); //清空队列
bool isEmpty() const; //判断队列是否为空 eg:const的作用是保证这个函数里不修改任何值
bool isFull() const; //判断队列是否为满
int getLength() const; //返回队列的长度
bool addQueue(int elem); //队列添加元素
bool deleteQueue(int &elem); //队列删除元素
void traverseQueue(); //遍历队列
};
#endif //_MYQUEUE__H
代码实现
#include "MyQueue.h"
MyQueue::MyQueue(int size){
_size = size; //队列容量
_myQueue = new int[_size]; //从堆中创建空间
_head = 0; //队头0
_tail = 0; //队尾0
_len = 0;
}
MyQueue::~MyQueue(){ //析构函数,释放堆空间
delete[]_myQueue;
_myQueue = NULL;
}
void MyQueue::clearQueue(){ //清空队列
_head = 0;
_tail = 0;
_len = 0;
}
bool MyQueue::isEmpty() const{ //队列判空
if (_len == 0){ //当队列为空是,条件是队头等于队尾,也就是队头跟队尾是在同一位置
cout << "队列为空" << endl;
return true;
}
return false;
}
bool MyQueue::isFull() const{ //队列判满
if (_len == _size){ //当队列为满时,容量与长度相等
cout << "队列已满" << endl;
return true;
}
return false;
}
int MyQueue::getLength() const{ //获取队列的长度
return _len;
}
bool MyQueue::addQueue(int elem){ //队尾增加元素
if (isFull()){
return false;
}
_myQueue[_tail] = elem; //在数组下标为0的地方添加第一个元素
_tail++; //队尾自增到数组下标为1的位置
_tail = _tail % _size; /*为了确保自增后的下标不会越过容量指向错误导致出错
比如创建一个容量为4的队列,那么数组下标就为0,1,2,3,如果添加完四个元素后
继续添加,则会指向下标为4的这个位置,那么内存就会报错,添加这句代码后能确保
数组最后一个元素的下标的指向是正确的,下面删除也是一样*/
_len++;
return true;
}
bool MyQueue::deleteQueue(int &elem){
if (isEmpty()){
return false;
}
elem = _myQueue[_head];
_head++;
_head = _head %_size;
_len--;
return true;
}
void MyQueue::traverseQueue(){
for (int k = 0; k < _len; k++){
cout << _myQueue[k%_size] << endl;
}
}
代码测试
#include "MyQueue.h"
int main(){
MyQueue *p = new MyQueue(4);
//添加元素测试
p->addQueue(1);
p->addQueue(2);
p->addQueue(3);
p->addQueue(4);
//遍历测试
p->traverseQueue();
//判满测试
p->isFull();
//删除测试
int e = 0;
p->deleteQueue(e);
cout << e << endl;
system("pause");
return 0;
}
OK,完工