队列:是一种线性表,它只允许先进先出,后进后出。
即只能在队首删除元素,在队尾添加元素。
队列三个重要组成部分:
1.存放队列元素的空间
2.队列的队首
3.队列的队尾
队列的基本操作:
1.初始化
2.是否为空
3.是否满了
4.添加元素
5.打印元素
6.删除元素法一(向前覆盖法)
7.删除元素二(向后位移法)
1.初始化
#define MAX_SIZE 10
typedef struct Queue {
int queue[MAX_SIZE];
int front;
int rear;
}Queue;
int init(Queue* q) { //初始化队列
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
q->front = 0;
q->rear = 0;
return 1;
}
2.是否为空,即判断队首和队尾是否相同即可,相同即为空
int ISempty(Queue* q) { //判断是否为空
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (q->front == q->rear) {
return 1;
}
else {
return 0;
}
}
3.是否满了:判断是否队尾等于最大存储数
int ISfull(Queue* q) { //判断是否满了
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (q->rear == MAX_SIZE) {
return 1;
}
else {
return 0;
}
}
4.添加元素,在队尾处添加元素,队尾再向后一位
int EnterQueue(Queue* q, int date) { //插入元素
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISfull(q)) {
cout << "队列已满 ,无法入队" << endl;
}
q->queue[q->rear] = date;
q->rear++;
return 1;
}
5.打印元素
int print(Queue* q) { //打印元素
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISempty(q)) {
cout << "队列为空,无法打印" << endl;
}
for (int i = q->front;i < q->rear;i++) {
cout << q->queue[i] << endl;
}
return 1;
}
6.删除元素法一(向前覆盖法)
int deQueue1(Queue* q, int& date) { //删除元素法1
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISempty(q)) {
cout << "队列为空,无法删除" << endl;
return 0;
}
date = q->queue[q->front];
for (int i = q->front + 1;i < q->rear;i++) {
q->queue[i - 1] = q->queue[i];
}
q->rear--;
return 1;
}
7.删除元素二(向后位移法)
int deQueue2(Queue* q, int& date) {
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISempty(q)) {
cout << "队列为空,无法删除" << endl;
return 0;
}
date = q->front;
q->front++;
return 1;
}
全部代码:
#include<iostream>
#include<Windows.h>
using namespace std;
#define MAX_SIZE 10
typedef struct Queue {
int queue[MAX_SIZE];
int front;
int rear;
}Queue;
int init(Queue* q);//初始化
int ISfull(Queue* q);//是否满了
int ISempty(Queue* q);//是否为空
int EnterQueue(Queue* q, int date); //队尾插入元素
int print(Queue* q);//打印元素
int deQueue1(Queue* q, int& date);//删除元素法1
int deQueue2(Queue* q, int& date);//删除元素法2
int main() {
Queue* q = new Queue;
int date=-1;
init(q);
for (int i = 0;i < 5;i++) {
EnterQueue(q, i);
}
print(q);
deQueue1(q, date);
cout << "头部元素:" << date << endl;
cout << "队列里的元素:" << endl;
print(q);
deQueue2(q, date);
cout << "头部元素:" << date << endl;
cout << "队列里的元素:" << endl;
print(q);
system("pause");
return 0;
}
int init(Queue* q) { //初始化队列
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
q->front = 0;
q->rear = 0;
return 1;
}
int ISfull(Queue* q) { //判断是否满了
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (q->rear == MAX_SIZE) {
return 1;
}
else {
return 0;
}
}
int ISempty(Queue* q) { //判断是否为空
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (q->front == q->rear) {
return 1;
}
else {
return 0;
}
}
int EnterQueue(Queue* q, int date) { //插入元素
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISfull(q)) {
cout << "队列已满 ,无法入队" << endl;
}
q->queue[q->rear] = date;
q->rear++;
return 1;
}
int print(Queue* q) { //打印元素
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISempty(q)) {
cout << "队列为空,无法打印" << endl;
}
for (int i = q->front;i < q->rear;i++) {
cout << q->queue[i] << endl;
}
return 1;
}
int deQueue1(Queue* q, int& date) { //删除元素法1
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISempty(q)) {
cout << "队列为空,无法删除" << endl;
return 0;
}
date = q->queue[q->front];
for (int i = q->front + 1;i < q->rear;i++) {
q->queue[i - 1] = q->queue[i];
}
q->rear--;
return 1;
}
int deQueue2(Queue* q, int& date) {
if (!q) {
cout << "初始化失败" << endl;
return 0;
}
if (ISempty(q)) {
cout << "队列为空,无法删除" << endl;
return 0;
}
date = q->front;
q->front++;
return 1;
}