队列¶
定义¶
队列是一种只允许在表的一端插入,在另外一段删除的存取受限的线性表。允许插入的一端称为队尾,允许删除的一端称为对头。像排队一样,先进入队列的元素先出队列。所以队列是一种先进先出的线性表。
除了栈和队列之外,还有一种限定性数据结构称为双端队列。双端队列是限定插入和删除操作在表的两端进行的线性表。实际使用中,还有输入受限的双端队列(一段输入,两端输出)和输出受限的双端队列(一端输出,两端输入)。这几种数据结构应用远不如栈和队列广泛。
队列也是操作受限的线性表,与线性表、栈类似,队列也有顺序存储结构和链式存储两种存储结构。
循环队列--队列的顺序存储结构¶
区别队满和队空有两种方法: - 是另设一标志位以区分队列是空还是不空, - 是少用一个元素空间,以队尾指针加1等于队头指针作为队满的标志,此时的状态是:(rear+1)%MAXSIZE = front
循环队列的核心就是 %MAXSIZE,取余的结果永远<=MAXSIZE,从而形成了一个循环!
代码:¶
#include<iostream>
#include<sstream>
using namespace std;
#define MAXSIZE 100
typedef int Element;
typedef struct {
Element data[MAXSIZE];
int front, rear;
}Sequeue;
//初始化
Sequeue Init() {
Sequeue q;
q.rear = q.front = 0;
return q;
}
//入队
Sequeue SeqIn(Sequeue q,int x) {
if ((q.rear + 1) % MAXSIZE == q.front) {
cout << "队满,入队失败!" << endl;
}
else {
q.data[q.rear] = x;
q.rear = (q.rear + 1) % MAXSIZE;
cout << "入队成功!" << endl;
}
return q;
}
//出队
Sequeue SeqOut(Sequeue q) {
if (q.front == q.rear) {
cout << "队空,无法出队!" << endl;
}
else {
cout << "出队元素是:" << q.data[q.front] << endl;
q.front = (q.front + 1) % MAXSIZE;
}
return q;
}
//读队头元素
void SeqHead(Sequeue q) {
if (q.front == q.rear) {
cout << "队空,没有队头元素" << endl;
}
else {
cout << "队头元素是:" << q.data[q.front] << endl;
}
}
//判断空
void SeqEmpty(Sequeue q) {
if (q.front == q.rear) {
cout << "队为空!" << endl;
}
else {
cout << "队不为空!" << endl;
}
}
//求队列长
void SeqLength(Sequeue q) {
cout << "对列长为:";
cout << (q.rear - q.front + MAXSIZE) % MAXSIZE << endl;
}
void print() {
cout << "******************************************" << endl;
cout << "* 1 入队 2 出队 *" << endl;
cout << "* 3 读队头元素 4 判断空 *" << endl;
cout << "* 5 队列长度 6 清屏 *" << endl;
cout << "* 7退出 *" << endl;
cout << "******************************************" << endl;
}
void main() {
int i, m;
Sequeue q = Init();
print();
while (1) {
cin >> i;
switch (i) {
case 1:cin >> m; q = SeqIn(q, m); break;
case 2:q = SeqOut(q); break;
case 3:SeqHead(q); break;
case 4:SeqEmpty(q); break;
case 5:SeqLength(q); break;
case 6:system("cls"); print(); break;
case 7:exit(0); break;
default:cout << "输入错误,请重新输入!" << endl; break;
}
}
}
链队列--队列的链式表示和实现¶
用链式存储结构表示的队列简称为链队列。一个链队列显然需要两个分别指示队头和队尾的指针(分别称为头指针和尾指针)才能唯一确定。和线性表的单链表一样,为了操作上的方便,我们也给链队列增加一个头结点,令头指针指向头结点,尾指针指向尾结点。
头指针front和尾指针rear是两个独立的指针变量,从结构上考虑,通常将二者封装在一个结构中。链表的类型描述如下: ```cpp typedef struct LQNode{ Element data; struct LQNode *next; }LQNode,*LinkedQNode; //链队列结点类型
typedef struct { struct LQNode *front, *rear; //头指针和尾指针 }LQueue,*LinkedQueue; //将头指针和尾指针封装在一起的链队列 ```
形成的队列结构是:
代码¶
#include<iostream>
#include<sstream>
using namespace std;
#define MAXSIZE 100
typedef int Element;
typedef struct LQNode{
Element data;
struct LQNode *next;
}LQNode,*LinkedQNode; //链队列结点类型
typedef struct {
struct LQNode *front, *rear; //头指针和尾指针
}LQueue,*LinkedQueue; //将头指针和尾指针封装在一起的链队列
//初始化
LinkedQueue LinkedQueueInit() {
LinkedQueue q;
LinkedQNode p;
q = (LQueue*)malloc(sizeof(LQueue));
p = (LQNode*)malloc(sizeof(LQNode));
p->next = NULL;
q->front = q->rear = p;
return q;
}
//入队
LinkedQueue LinkedQueueIn(LinkedQueue q,Element x) {
LinkedQNode p = (LQNode*)malloc(sizeof(LQNode));
p->data = x;
p->next = NULL;
q->rear->next = p;
q->rear = p;
cout << "入队成功!" << endl;
return q;
}
//出队
LinkedQueue LinkedQueueOut(LinkedQueue q) {
if (q->front==q->rear) {
cout << "队空,无法出队!" << endl;
}
else {
LinkedQNode p;
p = q->front->next;
cout << "出队元素是:" << p->data << endl;
q->front->next = p->next;
free(p);
if (q->front->next == NULL) {
q->rear = q->front;
}
}
return q;
}
//读队头元素
void LinkedQueueHead(LinkedQueue q) {
if (q->front == q->rear) {
cout << "队空,没有队头元素" << endl;
}
else {
cout << "队头元素是:" << q->front->next->data << endl;
}
}
//判断空
void LinkedQueueEmpty(LinkedQueue q) {
if (q->front == q->rear) {
cout << "队为空!" << endl;
}
else {
cout << "队不为空!" << endl;
}
}
//求队列长
void LinkedQueueLength(LinkedQueue q) {
int i = 0;
LinkedQNode p;
p = q->front;
while (p->next != NULL) {
p = p->next;
i++;
}
cout << "对列长为:" << i << endl;
}
void print() {
cout << "******************************************" << endl;
cout << "* 1 入队 2 出队 *" << endl;
cout << "* 3 读队头元素 4 判断空 *" << endl;
cout << "* 5 队列长度 6 清屏 *" << endl;
cout << "* 7退出 *" << endl;
cout << "******************************************" << endl;
}
void main() {
int i, m;
LinkedQueue q = LinkedQueueInit();
print();
while (1) {
cin >> i;
switch (i) {
case 1:cin >> m; q = LinkedQueueIn(q, m); break;
case 2:q = LinkedQueueOut(q); break;
case 3:LinkedQueueHead(q); break;
case 4:LinkedQueueEmpty(q); break;
case 5:LinkedQueueLength(q); break;
case 6:system("cls"); print(); break;
case 7:exit(0); break;
default:cout << "输入错误,请重新输入!" << endl; break;
}
}
}
本文总阅读量次 本站访客数人次