队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
顺序队列
顺序队列大致结构如下所示:
结构体定义
提示:
- 要有存数据的地方
- 能找到队头和队尾
typedef struct {
int data[MAXSIZE];//要有存数据的地方
//能找到队头和队尾
int front;
int rear;
}SqQueue;
初始化
提示:
- 动态内存分配是否成功?
- 队头和队尾是否初始化?
bool initQueue(SqQueue* &q) {
q = new SqQueue;
if (!q) {//动态内存分配是否成功?
return false;
}
q->front = q->rear = NULL;//队头和队尾是否初始化?
return true;
}
插入元素
提示:
- 队列是否已满?
- 队尾是否后移?
void queueInsert(SqQueue *q, int dat) {
if (q->rear >= MAXSIZE) {//队列是否已满?
cout << "队列已满!!!" << endl;
return;
}
q->data[q->rear++] = dat;//队尾是否后移?
}
删除元素
提示:
- 队列是否为空?
- 删除元素后元素的移动及队头指针的移动
void queueDelete(SqQueue *q) {
if (q->front == q->rear) {//队列是否为空?
cout << "队列为空!!!" << endl;
return;
}
//删除元素后元素的移动及队头指针的移动
for (int i = q->front; i < q->rear; i++) {
q->data[i] = q->data[i + 1];
}
q->rear--;
}
打印元素
无提示,选择自己喜欢的风格.
void queuePrint(SqQueue *q) {
for (int i = q->front; i < q->rear; i++) {
cout << q->data[i] << "\t";
}
cout << endl;
}
全部代码及测试代码
#include <iostream>
#define MAXSIZE 50
using namespace std;
typedef struct {
int data[MAXSIZE];
int front;
int rear;
}SqQueue;
bool initQueue(SqQueue* &q) {
q = new SqQueue;
if (!q) {
return false;
}
q->front = q->rear = NULL;
return true;
}
void queueInsert(SqQueue *q, int dat) {
if (q->rear >= MAXSIZE) {
cout << "队列已满!!!" << endl;
return;
}
q->data[q->rear++] = dat;
}
void queueDelete(SqQueue *q) {
if (q->front == q->rear) {
cout << "队列为空!!!" << endl;
return;
}
for (int i = q->front; i < q->rear; i++) {
q->data[i] = q->data[i + 1];
}
q->rear--;
}
void queuePrint(SqQueue *q) {
for (int i = q->front; i < q->rear; i++) {
cout << q->data[i] << "\t";
}
cout << endl;
}
int main(void) {
SqQueue *q;
initQueue(q);
int n;
int dat;
cout << "请输入个数" << endl;
cin >> n;
while (n--) {
cout << "请输入数据" << endl;
cin >> dat;
queueInsert(q, dat);
}
queuePrint(q);
queueDelete(q);
queuePrint(q);
system("pause");
return 0;
}
链队
链队大致结构如下所示:
结构体定义
提示:
- 能存储数据和下一个结点的地址
- 有队头和队尾指针
typedef struct LinkNode {//能存储数据和下一个结点的地址
int data;
LinkNode *next;
}LinkNode;
typedef struct {//有队头和队尾指针
LinkNode *front;
LinkNode *rear;
}LinkQueue;
初始化
提示:
- 动态内存分配是否成功?
- 队头和队尾指针是否初始化?
bool initLinkQueue(LinkQueue* &q) {
q = new LinkQueue;
if (!q) {//动态内存分配是否成功?
return false;
}
q->front = q->rear = NULL;//队头和队尾指针是否初始化?
return true;
}
插入元素
提示:
- 插入的结点可能为第一个结点
void linkQueueInsert(LinkQueue *q, int data) {
LinkNode *e = new LinkNode;
e->data = data;
e->next = NULL;
if (!q->rear) {//插入的结点可能为第一个结点
q->front = q->rear = e;
return;
}
q->rear->next = e;
q->rear = q->rear->next;
}
删除元素
提示:
- 队列可能为空
void linkQueueDelete(LinkQueue *q) {
if (!q->front) {//队列可能为空
cout << "队列为空!" << endl;
return;
}
LinkNode *e;
e = q->front;
q->front = q->front->next;
if (!q->front) {
q->rear = NULL;
}
delete e;
}
打印元素
无提示,选择自己喜欢的风格.
void printLinkQueue(LinkQueue *q) {
LinkNode *e = q->front;
while (e) {
cout << e->data << "\t";
e = e->next;
}
cout << endl;
}
全部代码及测试代码
#include <iostream>
using namespace std;
typedef struct LinkNode {
int data;
LinkNode *next;
}LinkNode;
typedef struct {
LinkNode *front;
LinkNode *rear;
}LinkQueue;
bool initLinkQueue(LinkQueue* &q) {
q = new LinkQueue;
if (!q) {
return false;
}
q->front = q->rear = NULL;
return true;
}
void linkQueueInsert(LinkQueue *q, int data) {
LinkNode *e = new LinkNode;
e->data = data;
e->next = NULL;
if (!q->rear) {
q->front = q->rear = e;
return;
}
q->rear->next = e;
q->rear = q->rear->next;
}
void linkQueueDelete(LinkQueue *q) {
if (!q->front) {
cout << "队列为空!" << endl;
return;
}
LinkNode *e;
e = q->front;
q->front = q->front->next;
if (!q->front) {
q->rear = NULL;
}
delete e;
}
void printLinkQueue(LinkQueue *q) {
LinkNode *e = q->front;
while (e) {
cout << e->data << "\t";
e = e->next;
}
cout << endl;
}
int main(void) {
LinkQueue *q;
initLinkQueue(q);
int n, data;
cout << "请输入插入元素的个数:";
cin >> n;
while (n--) {
cout << "请输入数据:";
cin >> data;
linkQueueInsert(q, data);
}
printLinkQueue(q);
linkQueueDelete(q);
printLinkQueue(q);
system("pause");
return 0;
}