队列原理
队列是一种先进先出的数据结构,是一种受限的线性结构,类似于生活中的排队。
结构体定义:
这里使用的是顺序存储,设立一个队首指针 front ,一个队尾指针 rear,分别指向队首和队尾元素。
typedef struct Queue
{
int data[MAX];
int front;
int rear;
}Queue;
队列代码实现
遍历
遍历十分简单,因为是顺序存储,所以可以直接使用下标访问。
void printQueue(Queue* q)
{
if (!q) return;
for (int i = q->front; i < q->rear; i++)
{
cout << q->data[i] << " ";
}
cout << endl;
}
入队
队列的入队是将数据插入到队列的尾部,然后进行尾指针加一就可以了。
bool enterQueue(Queue* q, int val)
{
if (!q) return false;
if (isFulll(q))
{
cout << "队列已满" << endl;
return false;
}
q->data[q->rear++] = val;
return true;
}
出队
队列的出队是删除队列首元素,这里的顺序存储有两种方式:
第一种是将首元素后面的数据往前移动,但是当数据量特别打的时候效率很低。
第二种是将首指针加一,效率很高,但是这样的方式会导致队列的存储空间越来越少。
bool deleteQueue(Queue* q, int & node)
{
if (!q) return false;
if (isEmpty(q))
{
cout << "队列为空" << endl;
return false;
}
node = q->data[q->front];
//第一种方法
for (int i = q->front; i < q->rear - 1; i++)
{
q->data[i] = q->data[i + 1];
}
//第二种方法
//q->front++;
q->rear--;
return true;
}
取首元素
int getHead(Queue * q)
{
if (!q || isEmpty(q)) return 0;
return q->data[q->front];
}
完整代码
#include <iostream>
using namespace std;
#define MAX 5 //队列长度
typedef struct Queue
{
int data[MAX];
int front;
int rear;
}Queue;
//初始化
bool initQueue(Queue* q)
{
if (!q) return false;
q->front = q->rear = 0;
return true;
}
//遍历
void printQueue(Queue* q)
{
if (!q) return;
for (int i = q->front; i < q->rear; i++)
{
cout << q->data[i] << " ";
}
cout << endl;
}
//判断队列为空
bool isEmpty(Queue* q)
{
if (!q) return false;
if (q->rear == q->front)
{
return true;
}
return false;
}
//判断队列满
bool isFulll(Queue* q)
{
if (!q) return false;
if (q->rear - q->front == MAX)
{
return true;
}
return false;
}
//入队
bool enterQueue(Queue* q, int val)
{
if (!q) return false;
if (isFulll(q))
{
cout << "队列已满" << endl;
return false;
}
q->data[q->rear++] = val;
return true;
}
//出队
bool deleteQueue(Queue* q, int & node)
{
if (!q) return false;
if (isEmpty(q))
{
cout << "队列为空" << endl;
return false;
}
node = q->data[q->front];
//第一种方法
for (int i = q->front; i < q->rear - 1; i++)
{
q->data[i] = q->data[i + 1];
}
//第二种方法
//q->front++;
q->rear--;
return true;
}
//取首元素
int getHead(Queue * q)
{
if (!q || isEmpty(q)) return 0;
return q->data[q->front];
}
int main(void)
{
Queue* q = new Queue;
initQueue(q);
cout << "插入5 10 15 20 25 30(队列长度为5)" << endl;
for (int i = 1; i < 7; i++)
{
enterQueue(q, i * 5);
}
printQueue(q);
cout << "队列首元素为:" << getHead(q) << endl;
int node = 0;
cout << "出队后" << endl;
deleteQueue(q, node);
cout << "出队的元素是:" << node << endl;
printQueue(q);
delete q;
return 0;
}