一、顺序队列的概念和分类
1、概念:顺序队列的底层结构是数据存储元素的,用两个整形数字来表示队头和队尾的下标front和back
2、顺序队列根据出入元素方式不同分为两种形式
在这里插入图片描述
二、代码展示
1、队头不动
编译环境VS2008
Queue.h
#pragma once
#include <stdio.h>
#include <assert.h>
#include <windows.h>
#define MAX_SIZE 8
typedef int DataType;
typedef struct Queue
{
DataType _array[MAX_SIZE];
int _front; //指向队头元素的下标
int _back; //指向队尾元素的下标
}Queue;
//队列的初始化
void QueueInit(Queue * q);
//队列中插入元素
void QueuePush(Queue* q, DataType date);
//队列中删除元素
void QueuePop(Queue* q);
//查看栈顶元素
DataType QueueTop(Queue* q);
//查看队尾元素
DataType QueueBack(Queue* q);
//查看队列的大小
int QueueSize(Queue* q);
//判断队列是否为空
int QueueEmpty(Queue* q);
Queue.c
#include "Queue.h"
//队列的初始化
void QueueInit(Queue * q)
{
assert(q);
q->_back = q->_front = 0;
}
//队列中插入元素
void QueuePush(Queue* q, DataType data)
{
assert(q);
if (q->_back == MAX_SIZE)
printf("队列元素已满,不能插入!!!\n");
q->_array[q->_back++] = data;
}
//队列中删除元素
void QueuePop(Queue* q)
{
int i = 0;
if (QueueEmpty(q))
printf("队列的元素为空,不能删除元素!!!\n");
for (i = 0; i < q->_back - 1; ++i)
{
q->_array[i] = q->_array[i + 1];
}
q->_back--;
}
//查看栈顶元素
DataType QueueTop(Queue* q)
{
assert(q);
if (QueueEmpty(q))
printf("队列为空!!!\n");
return q->_array[q->_front];
}
//查看队尾元素
DataType QueueBack(Queue* q)
{
assert(q);
if (q->_back == 0)
printf("队列为空!!!\n");
return q->_array[q->_back - 1];
}
//查看队列的大小
int QueueSize(Queue* q)
{
assert(q);
return q->_back;
}
//判断队列是否为空
int QueueEmpty(Queue* q)
{
assert(q);
return 0 == q->_back;
}
test.c
#include "Queue.h"
void test10();
int main()
{
test10();
system("pause");
return 0;
}
void test10()
{
Queue q;
QueueInit(&q);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePush(&q, 4);
QueuePush(&q, 5);
QueuePush(&q, 6);
QueuePush(&q, 7);
printf("size = %d\n", QueueSize(&q));
printf("front = %d\n", QueueTop(&q));
printf("back = %d\n", QueueBack(&q));
QueuePop(&q);
QueuePop(&q);
printf("size = %d\n", QueueSize(&q));
printf("front = %d\n", QueueTop(&q));
printf("back = %d\n", QueueBack(&q));
}
2、队头移动
Queue.h
#pragma once
#include <stdio.h>
#include <assert.h>
#include <windows.h>
#define MAX_SIZE 8
typedef int DataType;
typedef struct Queue
{
DataType _array[MAX_SIZE];
int _front; //指向队头元素的下标
int _back; //指向队尾元素的下标
}Queue;
//队列的初始化
void QueueInit(Queue * q);
//队列中插入元素
void QueuePush(Queue* q, DataType date);
//队列中删除元素
void QueuePop(Queue* q);
//查看栈顶元素
DataType QueueTop(Queue* q);
//查看队尾元素
DataType QueueBack(Queue* q);
//查看队列的大小
int QueueSize(Queue* q);
//判断队列是否为空
int QueueEmpty(Queue* q);
Queue.h
#include "Queue.h"
//队列的初始化
void QueueInit(Queue * q)
{
assert(q);
q->_back = q->_front = 0;
}
//队列中插入元素
void QueuePush(Queue* q, DataType data)
{
assert(q);
if (q->_back == MAX_SIZE)
printf("队列元素已满,不能插入!!!\n");
q->_array[q->_back++] = data;
}
//队列中删除元素
void QueuePop(Queue* q)
{
int i = 0;
if (QueueEmpty(q))
printf("队列的元素为空,不能删除元素!!!\n");
q->_front++;
}
//查看栈顶元素
DataType QueueTop(Queue* q)
{
assert(q);
if (QueueEmpty(q))
printf("队列为空!!!\n");
return q->_array[q->_front];
}
//查看队尾元素
DataType QueueBack(Queue* q)
{
assert(q);
if (QueueEmpty(q))
printf("队列为空!!!\n");
return q->_array[q->_back - 1];
}
//查看队列的大小
int QueueSize(Queue* q)
{
assert(q);
return q->_back-q->_front;
}
//判断队列是否为空
int QueueEmpty(Queue* q)
{
assert(q);
return q->_front == q->_back;
}
test.c
#include "Queue.h"
void test10();
int main()
{
test10();
system("pause");
return 0;
}
void test10()
{
Queue q;
QueueInit(&q);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePush(&q, 4);
QueuePush(&q, 5);
QueuePush(&q, 6);
QueuePush(&q, 7);
printf("size = %d\n", QueueSize(&q));
printf("front = %d\n", QueueTop(&q));
printf("back = %d\n", QueueBack(&q));
QueuePop(&q);
QueuePop(&q);
printf("size = %d\n", QueueSize(&q));
printf("front = %d\n", QueueTop(&q));
printf("back = %d\n", QueueBack(&q));
}