目录
一、顺序队列
队列特征:先进后出、后进后出。
1、存储结构
//队列
typedef struct
{
int data[MAXSIZE]; //存放元素
int front; //队首(出队)
int rear; //队尾(入队)
}SqQueue;
SqQueue Q;
2、入队和出队
入队:从队尾放入元素,rear++
出队:从队首取出元素,front++
总代码
//顺序队列
//主要用front和rear分别指向队首和队尾
//进栈时:rear指向处放入数据,rear++
//出栈时,front指向处取出数据,front++
#include<stdio.h>
#define MAXSIZE 6
//队列
typedef struct
{
int data[MAXSIZE]; //存放元素
int front; //队首(出队)
int rear; //队尾(入队)
}SqQueue;
SqQueue Q;
void Init_List()
{
Q.front = 0;
Q.rear = 0;
}
//入队
void EnQueue(int num)
{
if (Q.rear >= MAXSIZE) //判断队列满
{
printf("栈已满!\n");
return;
}
Q.data[Q.rear++] = num; //元素入队,rear++
}
//出队
int DeQueue()
{
int s;
if (Q.front == Q.rear) //判断队列空
{
printf("栈空!\n");
return -1;
}
return Q.data[Q.front++]; //元素出队,front++
}
int main()
{
Init_List(); //初始化
//入队
EnQueue(0);
EnQueue(1);
EnQueue(2);
EnQueue(3);
EnQueue(4);
EnQueue(5);
//EnQueue(5); //队列满测试
//出队
printf("%d\n", DeQueue());
printf("%d\n", DeQueue());
printf("%d\n", DeQueue());
printf("%d\n", DeQueue());
printf("%d\n", DeQueue());
printf("%d\n", DeQueue());
return 0;
}
二、循环队列
存储结构和队列一样,把存储空间当成一个环,完成首位相接,完成循环,其核心是一个算法表达式:
//为什么要加1:如果不加1,那么和队列为空的条件相同(front==rear)
Q.rear = (Q.rear + 1) % MAXSIZE; //起到循环的效果(循环队列入队)
Q.front = (Q.front + 1) % MAXSIZE; //起到循环的效果(循环队列出队)
用上面的代码,把空间范围禁锢在MAXSIZE之内,不会超过其范围。rear和front也只会在里面移动。
总代码:
//循环队列
//用(front+1)%MAXSIZE完成在MAXSIZE内的循环
//(rear+1)%MAXSIZE同理
//为什么要加1:如果不加1,那么和队列为空的条件相同(front==rear)
#include<stdio.h>
#define MAXSIZE 6 //大小为6,但循环队列少存一个,实际只存5个元素
//队列
typedef struct
{
int data[MAXSIZE];
int front;
int rear;
}SqQueue;
SqQueue Q;
void Init_List()
{
Q.front = 0;
Q.rear = 0;
}
//入队
void EnQueue(int num)
{
if ((Q.rear + 1) % MAXSIZE == Q.front) //判断队列满
{
printf("队列已满!\n");
return;
}
Q.data[Q.rear] = num;
Q.rear = (Q.rear + 1) % MAXSIZE; //起到循环的效果(循环队列入队)
}
//出队
int DeQueue()
{
int s;
if (Q.front == Q.rear) //判断队列空
{
printf("队列已空!\n");
return -1;
}
s = Q.data[Q.front];
Q.front = (Q.front + 1) % MAXSIZE; //起到循环的效果(循环队列出队)
return s;
}
int main()
{
Init_List(); //初始化
//入队
EnQueue(0);
EnQueue(1);
EnQueue(2);
EnQueue(3);
EnQueue(4);
//EnQueue(5); //队满测试
//出队
printf("%d\n", DeQueue());
printf("%d\n", DeQueue());
printf("%d\n", DeQueue());
printf("%d\n", DeQueue());
printf("%d\n", DeQueue());
//printf("%d\n", DeQueue()); //队空测试
return 0;
}
三、链队列
1、存储结构
*rear和*front由原来的int变成了指针,分别指向队尾和队首元素的地址。
前后元素通过*next相连接。
//链队列
typedef struct Node
{
int data;
Node* next;
}Node;
Node* head; //头结点
Node* front; //队首
Node* rear; //队尾
2、入队和出队
入队:从队尾放入元素,rear指向新的队尾元素。
出队:从队首取出元素,front指向新的队首元素。
总代码
//链队列
//可以实现自由插入
//链队列用front->next指向队首元素,rear指向队尾元素
//入队rear动; 出队front->next动(front不动)
#include <stdio.h>
#include <malloc.h>
//链队列
typedef struct Node
{
int data;
Node* next;
}Node;
Node* head; //头结点
Node* front; //队首
Node* rear; //队尾
void Init_List()
{
head = (Node*)malloc(sizeof(Node));
head->next = NULL;
front = head;
rear = head;
}
//入队
void EnQueue(int num)
{
Node* p = (Node*)malloc(sizeof(Node));
p->data = num;
p->next = NULL;
rear->next = p; //连接p(head不存放值)
rear = p; //指向p
}
//出队
int DeQueue()
{
int num;
Node* s;
if (rear == front)
{
printf("队列为空!\n");
return -1;
}
s = front->next;
num = s->data;
front->next = front->next->next;
free(s);
return num;
}
int main()
{
Init_List(); //初始化
//入队
EnQueue(0);
EnQueue(1);
EnQueue(2);
EnQueue(3);
//出队
printf("%d\n", DeQueue());
printf("%d\n", DeQueue());
printf("%d\n", DeQueue());
printf("%d\n", DeQueue());
return 0;
}
可能有写的不好或者不对的地方,希望大家批评指正!Thanks♪(・ω・)ノ