队列是一种受限的线性表,(Queue),它是一种运算受限的线性表,先进先出(FIFO First In First Out)
队列是一种受限的线性结构
它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
使用数组实现
#include "stdio.h"
//最大容量
#define max_size 10
typedef struct Queue{
// 定义数组,假设都是int型
int queue[max_size];
// 队头指针
int front;
// 队尾指针
int rear;
}SeqQueue;
void InitQueue(SeqQueue *sq){
if(!sq){
return ;
}
// 队头,队尾指针都置零
sq->front = sq->rear = 0;
}
bool IsEmpty(SeqQueue* sq){
if(!sq){
return false;
}
if(sq->rear == sq->front){
return true;
}
return false;
}
bool IsFull(SeqQueue* sq){
if(!sq){
return false;
}
// 看队尾指针是不是等于最大容量
if(sq->rear == max_size){
return true;
}
return false;
}
void EnterQueue(SeqQueue* sq, int value){
if(IsFull(sq)){
printf("无法插入,队列已满\n");
}
// 队尾插入元素
sq->queue[sq->rear] = value;
sq->rear++;
}
void DisplayQueue(SeqQueue* sq){
if(!sq){
return ;
}
int count = sq->front;
while (count < sq->rear){
printf("%d, ", sq->queue[count]);
count++;
}
printf("\n");
}
int main(){
SeqQueue *sq = new SeqQueue ;
// 初始化
InitQueue(sq);
for(int i = 0; i < 10; i++){
EnterQueue(sq, i);
}
printf("插入完毕\n");
DisplayQueue(sq);
return 0;
}
出队
#include "stdio.h"
//最大容量
#define max_size 10
typedef struct Queue{
// 定义数组,假设都是int型
int queue[max_size];
// 队头指针
int front;
// 队尾指针
int rear;
}SeqQueue;
void InitQueue(SeqQueue *sq){
if(!sq){
return ;
}
// 队头,队尾指针都置零
sq->front = sq->rear = 0;
}
bool IsEmpty(SeqQueue* sq){
if(!sq){
return false;
}
if(sq->rear == sq->front){
return true;
}
return false;
}
bool IsFull(SeqQueue* sq){
if(!sq){
return false;
}
// 看队尾指针是不是等于最大容量
if(sq->rear == max_size){
return true;
}
return false;
}
void EnterQueue(SeqQueue* sq, int value){
if(IsFull(sq)){
printf("无法插入,队列已满\n");
}
// 队尾插入元素
sq->queue[sq->rear] = value;
sq->rear++;
}
//将第一个元素出队
int DeQueue(SeqQueue* sq, int *value){
if(!sq || IsEmpty(sq)){
printf("该队列现在为空\n");
return 0;
}
// 出队失败
if(!value){
return 0;
}
*value = sq->queue[sq->front];
for(int i = sq->front + 1; i < sq->rear; i++){
// 移动后面的元素
sq->queue[i - 1] = sq->queue[i];
}
// 出队,队尾指针减1
sq->rear--;
return 1;
}
void DisplayQueue(SeqQueue* sq){
if(!sq){
return ;
}
int count = sq->front;
while (count < sq->rear){
printf("%d, ", sq->queue[count]);
count++;
}
printf("\n");
}
int main(){
SeqQueue *sq = new SeqQueue ;
// 初始化
InitQueue(sq);
for(int i = 0; i < 10; i++){
EnterQueue(sq, i);
}
printf("插入完毕\n");
DisplayQueue(sq);
int value;
DeQueue(sq, &value);
printf("出队的元素是:%d\n", value);
printf("出队以后的队列:\n");
DisplayQueue(sq);
return 0;
}
逐个出队
#include "stdio.h"
//最大容量
#define max_size 10
typedef struct Queue{
// 定义数组,假设都是int型
int queue[max_size];
// 队头指针
int front;
// 队尾指针
int rear;
}SeqQueue;
void InitQueue(SeqQueue *sq){
if(!sq){
return ;
}
// 队头,队尾指针都置零
sq->front = sq->rear = 0;
}
bool IsEmpty(SeqQueue* sq){
if(!sq){
return false;
}
if(sq->rear == sq->front){
return true;
}
return false;
}
bool IsFull(SeqQueue* sq){
if(!sq){
return false;
}
// 看队尾指针是不是等于最大容量
if(sq->rear == max_size){
return true;
}
return false;
}
void EnterQueue(SeqQueue* sq, int value){
if(IsFull(sq)){
printf("无法插入,队列已满\n");
}
// 队尾插入元素
sq->queue[sq->rear] = value;
sq->rear++;
}
//
int PopQueue(SeqQueue* sq, int *value){
if(!sq || IsEmpty(sq)){
printf("该队列现在为空\n");
return 0;
}
// 出队失败
if(!value){
return 0;
}
*value = sq->queue[sq->front];
for(int i = sq->front + 1; i < sq->rear; i++){
// 移动后面的元素
sq->queue[i - 1] = sq->queue[i];
}
// 出队,队尾指针减1
sq->rear--;
return 1;
}
void DisplayQueue(SeqQueue* sq){
if(!sq){
return ;
}
int count = sq->front;
while (count < sq->rear){
printf("%d, ", sq->queue[count]);
count++;
}
printf("\n");
}
int main(){
SeqQueue *sq = new SeqQueue ;
// 初始化
InitQueue(sq);
for(int i = 0; i < 10; i++){
EnterQueue(sq, i);
}
printf("插入完毕\n");
DisplayQueue(sq);
int value;
for(int i = 0; i < 10; i++){
printf("第%d次出队\n", i + 1);
if(PopQueue(sq, &value)){
printf("出队成功,出队元素是:%d\n", value);
} else{
printf("出队失败!\n");
}
printf("出队以后的结果:");
DisplayQueue(sq);
}
return 0;
}