目录
前言
本篇博客介绍栈和队列的表示和实现。
1.顺序队列的描述
图1.顺序队列的描述
2.队列的顺序表示和实现
1.定义
#define MAXQueueSIZE 6 // 最大队列长度
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType *base; // 存储空间基地址
int front; // 头指针
int rear; // 尾指针
} SqQueue;
2.初始化
队列初始化的时候,队头和队尾指针均为0
// 队列初始化
Status initSqQueue(SqQueue *sqQueue) {
sqQueue->base = (ElemType *)malloc(sizeof(ElemType) * MAXQueueSIZE);
if (!sqQueue->base) { // 内存分配失败
return 0;
}
sqQueue->front = sqQueue->rear = 0;
return 1;
}
3.销毁
释放顺序队列存储空间
// 销毁队列
void destroySqQueue(SqQueue *sqQueue) {
free(sqQueue->base);
}
4.清空
// 清空队列
void clearSqQueue(SqQueue *sqQueue) {
sqQueue->front = sqQueue->rear = 0;
}
5.空队列
队头和队尾相同的时候为空队列。
// 判断队列是否为空
Status isEmptySqQueue(SqQueue *sqQueue) {
return sqQueue->front == sqQueue->rear;
}
6.队列长度
比较栈顶和栈顶的指针
// 获取队列长度
int sqQueueLength(SqQueue *sqQueue) {
return sqQueue->rear - sqQueue->front;
}
7.获取队头
获取队头元素。
// 获取队列的队首元素
Status getSqQueueHead(SqQueue *sqQueue, ElemType *element) {
if (isEmptySqQueue(sqQueue)) {
return 0; // 队列为空
}
*element = sqQueue->base[sqQueue->front];
return 1; // 成功获取队首元素
}
8.入队
// 入队
Status enSqQueue(SqQueue *sqQueue, int element) {
if (sqQueue->rear == MAXQueueSIZE) { // 队满
return 0;
}
sqQueue->base[sqQueue->rear] = element;
sqQueue->rear++;
return 1;
}
9.出队
// 出队列
Status deSqQueue(SqQueue *sqQueue, int *element) {
if (isEmptySqQueue(sqQueue)) { // 队列为空
return 0;
}
*element = sqQueue->base[sqQueue->front];
sqQueue->front++;
return 1;
}
10.遍历队列
// 遍历顺序队列
void traverseSqQueue(SqQueue *sqQueue) {
for (int i = sqQueue->front; i < sqQueue->rear; i++) {
printf("%d\t", sqQueue->base[i]);
}
printf("\n");
}
11.完整代码
#include <stdio.h>
#include <stdlib.h>
#define MAXQueueSIZE 6 // 最大队列长度
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType *base; // 存储空间基地址
int front; // 头指针
int rear; // 尾指针
} SqQueue;
// 队列初始化
Status initSqQueue(SqQueue *sqQueue) {
sqQueue->base = (ElemType *)malloc(sizeof(ElemType) * MAXQueueSIZE);
if (!sqQueue->base) { // 内存分配失败
return 0;
}
sqQueue->front = sqQueue->rear = 0;
return 1;
}
// 销毁队列
void destroySqQueue(SqQueue *sqQueue) {
free(sqQueue->base);
}
// 清空队列
void clearSqQueue(SqQueue *sqQueue) {
sqQueue->front = sqQueue->rear = 0;
}
// 判断队列是否为空
Status isEmptySqQueue(SqQueue *sqQueue) {
return sqQueue->front == sqQueue->rear;
}
// 获取队列长度
int sqQueueLength(SqQueue *sqQueue) {
return sqQueue->rear - sqQueue->front;
}
// 获取队列的队首元素
Status getSqQueueHead(SqQueue *sqQueue, ElemType *element) {
if (isEmptySqQueue(sqQueue)) {
return 0; // 队列为空
}
*element = sqQueue->base[sqQueue->front];
return 1; // 成功获取队首元素
}
// 入队
Status enSqQueue(SqQueue *sqQueue, int element) {
if (sqQueue->rear == MAXQueueSIZE) { // 队满
return 0;
}
sqQueue->base[sqQueue->rear] = element;
sqQueue->rear++;
return 1;
}
// 出队列
Status deSqQueue(SqQueue *sqQueue, int *element) {
if (isEmptySqQueue(sqQueue)) { // 队列为空
return 0;
}
*element = sqQueue->base[sqQueue->front];
sqQueue->front++;
return 1;
}
// 遍历顺序队列
void traverseSqQueue(SqQueue *sqQueue) {
for (int i = sqQueue->front; i < sqQueue->rear; i++) {
printf("%d\t", sqQueue->base[i]);
}
printf("\n");
}
int main(int argc, const char *argv[]) {
SqQueue sqQueue;
printf("顺序队列初始化中...\n");
if (initSqQueue(&sqQueue)) {
printf("队列初始化成功!\n");
}
printf("\n入队列测试...\n");
for (int i = 1; i <= 7; i++) {
if (enSqQueue(&sqQueue, i)) {
printf("数据元素%d入队成功!\n", i);
} else {
printf("数据元素%d入队失败!\n", i);
}
}
printf("入队之后的队列\n");
traverseSqQueue(&sqQueue);
printf("\n出队列测试...\n");
int element;
for (int i = 1; i <= 3; i++) {
if (deSqQueue(&sqQueue, &element)) {
printf("出队成功,出队列元素:%d\n", element);
} else {
printf("出队列失败!\n");
}
}
return 0;
}