Queues 队列
1. Definiation
What is a queue?
A queue is a list. With a queue, inseration is done at one end (known as rear) whereas deletion is performed at the other end (known as front).

2. Operations
指针对列
无法自定义队长
// array queue
#include<iostream>
using namespace std;
struct Node
{
int data;
};
class Queue
{
public:
//初始化
Queue()
{
front = -1;
rear = -1;
}
//判断是否为空
bool isEmpty()
{
if (rear == front)
return true;
return false;
}
//判队满
bool isFull()
{
if (rear - front == 10)
return true;
return false;
}
//入队列
void EnQueue(int item)
{
if (!isFull())
{
rear += 1;
node[rear].data = item;
}
else
{
cout << "Full" << endl;
}
}
//出队列
void DiQueue()
{
if (!isEmpty())
{
front += 1;
}
else
{
cout << "Empty" << endl;
}
}
//取队头
int GetHead()
{
if (!isEmpty())
{
int temp = node[front+1].data;
return temp;
}
else
{
cout << "Empty" << endl;
return 0;
}
}
//得队长
int GetSize()
{
return rear - front;
}
private:
int front; //队头指针总是指向队头元素的前一个位置
int rear;
Node node[10];
};
可自定义队长
//自己动手写queue
//array queue
template<typename Object>
struct Node
{
Object data;
};
template<typename Object>
class Queue
{
public:
//初始化
Queue(int m)
{
init(m);
}
Queue&operator=(Queue&q)
{
if (this == &q)
return *this;
clear();
for (int i = 0; i < q.curSize; i++)
this->EnQueue(q.list[i].data);
return *this;
}
Queue(Queue&q)
{
init(q.maxsize);
*this = q;
}
//删除队列
~Queue()
{
delete list;
}
//判断是否为空
bool isEmpty()
{
if (curSize == 0)
return true;
return false;
}
//判队满
bool isFull()
{
if (curSize == maxsize)
return true;
return false;
}
//入队列
void EnQueue(int item)
{
if (!isFull())
{
rear += 1;
list[rear].data = item;
curSize++;
}
else
{
cout << "Full" << endl;
}
}
//出队列
void DiQueue()
{
if (!isEmpty())
{
front += 1;
curSize--;
}
else
{
cout << "Empty" << endl;
}
}
//取队头
int GetHead()
{
if (!isEmpty())
{
int temp = list[front + 1].data;
return temp;
}
else
{
cout << "Empty" << endl;
return 0;
}
}
//得队长
int GetSize()
{
return curSize;
}
//清空队列
void clear()
{
for (int i = 0; i<curSize; i++)
{
if (isEmpty())
{
return;
}
else
{
rear--;
}
}
curSize = 0;
}
private:
int front;
int rear;
int maxsize;
int curSize;
Node<Object>* list;
void init(int m)
{
front = -1;
rear = -1;
maxsize = m;
curSize = 0;
list = new Node<Object>[maxsize];
}
};
一般的数组队列会出现假溢出的问题,为了解决这个问题,我们可以利用循环队列
需要注意的是,你设计的队列大小与实际可以用到的队列大小是不一样的,总是-1
// circular queue
#include<iostream>
using namespace std;
struct Node
{
int data;
};
class CirQueue
{
public:
//初始化
CirQueue()
{
rear = 3;
front = 3;
}
//判空
bool isEmpty()
{
if (front == rear)
return true;
return false;
}
//判满,牺牲队列的一个空间来判满
bool isFull()
{
if ((rear + 1) % 4 == front)
return true;
return false;
}
//入队
void EnQueue(int item)
{
if (!isFull())
{
rear = (rear + 1) % 4;
node[rear].data = item;
}
else
{
cout << "Full" << endl;
}
}
//出队
void DiQueue()
{
if (!isEmpty())
{
front = (front + 1) % 4;
}
else
{
cout << "Empty" << endl;
}
}
//取队头
int GetHead()
{
if (!isEmpty())
{
return node[(front+1)%4].data;
}
else return -1;
}
private:
int front;
int rear;
Node node[4];
};
其实不用游标来判断队空与队满就不用牺牲一个空间了
//自己动手写queue
//circular queue
template<typename Object>
struct Node
{
Object data;
Node(const Object &d = Object()) :data(d){}
};
template<typename Object>
class CircularQueue
{
public:
//the big three
CircularQueue(int m)
{
init(m);
}
CircularQueue(CircularQueue& cq)
{
init(cq.maxSize);
*this = cq;
}
~CircularQueue()
{
delete[] node;
}
CircularQueue& operator=(CircularQueue &cq)
{
if (this == &cq)
return *this;
clear();
for (int i = 0; i<cq.curSize; i++)
this->EnQueue(cq.node[i].data);
return *this;
}
//判空
bool isEmpty()
{
return curSize == 0;
}
//判满
bool isFull()
{
return curSize == maxSize;
}
//入队
void EnQueue(Object item)
{
if (!isFull())
{
curSize++;
}
rear = (rear + 1) % maxSize;
node[rear].data = item;
}
//出队
void DIQueue()
{
if (!isEmpty())
{
head = (head + 1) % maxSize;
curSize--;
}
}
//取队头
Object GetHead()
{
return node[(head + 1) % maxSize].data;
}
//得队长
int GetSize()
{
return curSize;
}
//清空队列
void clear()
{
head = maxSize - 1;
rear = maxSize - 1;
curSize = 0;
}
private:
int head;
int rear;
int maxSize;
int curSize;
Node<Object>*node;
void init(int m)
{
head = m - 1;
rear = m - 1;
maxSize = m;
curSize = 0;
node = new Node<Object>[maxSize];
}
};
链表队列
就无什么假溢出的问题了
template<typename Type>
struct Node
{
Type data;
Node*next;
Node*prev;
Node(const Type& d = Type(), Node*p = NULL, Node *n = NULL) :data(d), prev(p), next(n){}
};
template<typename Type>
class Queue
{
public:
Queue()
{
init();
}
Queue(Queue& q)
{
init();
*this = q;
}
~Queue()
{
clear();
delete head;
delete tail;
}
const Queue& operator= (const Queue& q)
{
if (this == &q)
return *this;
clear();
Node<Type>*p = q.head->next;
while (p->next != q.tail)
{
this.EnQueue(p->data);
p = p->next;
}
return *this;*/
}
bool IsEmpty()
{
return size == 0;
}
void EnQueue(Type item)
{
Node<Type>*p = new Node<Type>;
p->data = item;
p->prev = tail->prev;
tail->prev->next = p;
tail->prev = p;
p->next = tail;
size++;
}
void DIQueue()
{
if (!IsEmpty())
{
Node<Type>*p = head->next;
head->next = p->next;
p->next->prev = head;
delete p;
size--;
}
}
Type GetHead()
{
return (head->next->data);
}
void clear()
{
while (head->next != tail)
{
DIQueue();
}
size = 0;
}
int GetSize()
{
return size;
}
private:
Node<Type>*tail;
Node<Type>*head;
int size;
void init()
{
head = new Node<Type>;
tail = new Node<Type>;
head->next = tail;
tail->prev = head;
size = 0;
}
};

浙公网安备 33010602011771号