一、废话不多说,直接看代码
#include <iostream> using namespace std; // 定义队列节点 typedef struct node { int data; node *next; }node; // 定义管理队列的结构体 typedef struct linkQueue { int size; node *front; node *rear; }linkQueue; // 初始化队列节点 node *initNode() { node *p = new node; if(!p) { cout << "动态分配内存空间失败\n"; return NULL; } p->data = 0; p->next = NULL; return p; } // 初始化管理队列节点 linkQueue *initQueue() { linkQueue *q = new linkQueue; if(!q) { cout << "动态分配内存空间失败\n"; return NULL; } q->front = NULL; q->rear = q->front; q->size = 0; return q; } // 队尾入队 bool enQueue(linkQueue *q, node *p) { if(!q) { return false; } // 当第一个元素入队时,要同时修改q->front 和 q->rear if(!q->size) { q->front = p; q->rear = p; } else { q->rear->next = p; // 插入到队尾 q->rear = p; // 修改队尾指针 } q->size++; // 修改队列容量 return true; } // 队头出队 bool deQueue(linkQueue *q, int *data) { if(!q || !q->size) { return false; } node *tmp = q->front; // 临时保存队头指针 *data = tmp->data; // 保存队头元素 q->front = tmp->next; // 修改队头指针 q->size--; // 修改队列容量 // 出队到最后一个元素时,要修改q->rear = NULL; if(!q->size) { q->rear = NULL; } delete tmp; return true; } // 判断是否为空队 int isEmpty(linkQueue *q) { if(!q) { return -1; } return q->size > 0; } // 获取队列容量 int queueLength(linkQueue *q) { if(!q) { return -1; } return q->size; } // 取队头元素 bool getFront(linkQueue *q, int *data) { if(!q || !q->size) { return false; } *data = q->front->data; return true; } // 取队尾元素 bool getRear(linkQueue *q, int *data) { if(!q || !q->size) { return false; } *data = q->rear->data; return true; } // 清空队列 bool clearQueue(linkQueue *q) { if(!q) { return false; } node *tmp; for(int i = 0; i < q->size; i++) { tmp = q->front; q->front = tmp->next; delete tmp; } q->front = NULL; q->rear = NULL; q->size = 0; return true; } // 销毁队列 bool destroyQueue(linkQueue *q) { if(clearQueue(q)) { delete q; return true; } return false; } int main() { int i, data; node *p; linkQueue *q; q = initQueue(); if(!q) { cout << "初始化队列管理节点失败\n"; return -1; } while(1) { cout << "请选择你的操作, 1.入队 2.出队 3.队的容量 4.判空 5.清空队列 6.销毁队列 7.退出 "; cin >> i; switch(i) { case 1: p = initNode(); if(!p) { cout << "初始化队列节点失败\n"; break; } cout << "请输入入队数据:"; cin >> p->data; if(enQueue(q, p)) { cout << "入队成功\n"; } else { cout << "入队失败\n"; } break; case 2: if(deQueue(q, &data)) { cout << "队头元素:" << data << endl; } else { cout << "空队\n"; } break; case 3: data = queueLength(q); if(data > -1) { cout << "队的容量:" << data << endl; } else { cout << "队不存在\n"; } break; case 4: data = isEmpty(q); if(data > 0) { cout << "队非空\n"; } else if(data == 0) { cout << "空队\n"; } else if(data == -1) { cout << "队不存在\n"; } break; case 5: if(clearQueue(q)) { cout << "清空成功\n"; } else { cout << "队不存在\n"; } break; case 6: if(destroyQueue(q)) { q = NULL; cout << "销毁成功\n"; } else { cout << "队不存在\n"; } break; } if(i == 7) { cout << "你已退出\n"; break; } } return 0; }
二、简单分析
如果你学过数据结构,不是很理解队,看这个会对你有很大的帮助,代码里的注释到位,易错点指出,认真看基本能看懂。难点就是如何定义一个队,有很多种方法,一种像这里的,先定义一个管理的结构体,然后在用这个管理的结构体来管理队列中的节点,操作方便。