数据结构与算法学习笔记三---栈和队列的表示和实现(C语言)

目录

前言

一、栈

1.栈的概念

2.栈的表示和实现

1.定义

2.初始化

3.销毁

4.清空

5.栈空

6.栈的长度

7.获取栈顶元素

8.入栈

9.出栈

 10.遍历

11.完整代码

二、队列

1.队列的概念

2.队列的链式表示和实现

1.定义

2.初始化

3.销毁

4.清空

5.空队列

6.队列长度

7.获取队头

8.入队

9.出队

 10.遍历队列

11.完整代码

3.队列的顺序表示和实现

1.定义

2.初始化

3.销毁

4.清空

5.空队列

6.队列长度

7.获取队头

8.入队

9.出队

 10.遍历队列

11.完整代码

4.循环队列的顺序表示和实现

1.定义

2.初始化

3.销毁

4.清空

5.空队列

6.队列长度

7.获取队头

8.入队

9.出队

 10.遍历队列

11.完整代码


前言

    本篇博客介绍栈和队列的表示和实现。

一、栈

1.栈的概念

        栈是限定仅在表尾进行插入和删除的线性表。表尾称为栈顶,表头称为栈底。不含元素的栈称为空栈。

        栈是一种具有特定操作的数据结构,它按照"先进后出"的原则存储和访问数据。栈具有两个基本操作,分别为入栈(push)和出栈(pop)。入栈将元素放入栈的顶部,出栈则将栈顶的元素取出。栈在计算机科学中广泛应用,例如函数调用、表达式求值、递归算法等。

2.栈的表示和实现

1.定义

        我们一般使用顺序表来表示栈。使用一段连续的存储空间存储栈中的元素。

#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10   // 存储空间分配增量
#define Status int
#define ElementType inttypedef struct{ElementType * base;// 栈底指针ElementType * top; // 栈顶指针int stacksize; // 栈的当前可以使用的最大容量
}SeqStack;

2.初始化

        栈初始化的时候,给栈的基址分配存储空间,初始化之后,栈顶和栈底相同。

栈的基本操作
Status initStack(SeqStack *seqStack){seqStack->base = (ElementType *)malloc(sizeof(ElementType) * STACK_INIT_SIZE);if (!seqStack->base) {return 0;}seqStack->top = seqStack->base;seqStack->stacksize = STACK_INIT_SIZE;return 1;
}

3.销毁

        入栈的时候,我们首先判断下顺序栈是否已满,如果栈满则需要追加存储空间。然后入栈,栈顶指针上移。

//如果栈存在 销毁栈
void destroyStack(SeqStack *seqtack){free(seqtack->base);//释放栈基址的存储空间seqtack->base = seqtack->top = NULL;//栈顶和栈底置空seqtack->stacksize = 0;//栈大小置零
}

4.清空

        出栈的时候,首先判断栈是否为空,然后取出栈顶元素。

void clearStack(SeqStack * seqStack){seqStack->top = seqStack->base;
}

5.栈空

        判断栈空,比较栈顶和栈底是否相同。

//栈空
Status seqStackEmpty(SeqStack *seqStack){return seqStack->top == seqStack->base;
}

6.栈的长度

        比较栈顶和栈顶的指针

//栈的长度
int seqStackLength(SeqStack * seqStack){return seqStack->top - seqStack->base;
}

7.获取栈顶元素

        入栈的时候,我们首先判断下顺序栈是否已满,如果栈满则需要追加存储空间。然后入栈,栈顶指针上移。

// 获取栈顶元素
Status getSeqStackTop(SeqStack * seqStack,int *element){if (seqStack->top == seqStack->base) {return 0;}*element = *seqStack->top;return 1;
}

8.入栈

//入栈
Status push(SeqStack *seqStack,ElementType element){if (seqStack->top -seqStack->base >= seqStack->stacksize) {//栈满seqStack->base = (ElementType *)realloc(seqStack->base, (seqStack->stacksize + STACKINCREMENT) * sizeof(ElementType));if (!seqStack->base) {return 0;}seqStack->stacksize = seqStack->stacksize + STACKINCREMENT;seqStack->top = seqStack->base + seqStack->stacksize;}*seqStack->top++ = element;return 1;
}

9.出栈

Status popSeqStack(SeqStack * seqStack,int * element){if (seqStack->top == seqStack->base) {//栈空return 0;}* element = * (--seqStack->top);return 1;
}

 10.遍历

void stackTraverse(SeqStack * seqStack){int *p = seqStack->base;while (p < seqStack->top) {printf("%d\t",*p++);}printf("\n");
}

11.完整代码

#include "stack.h"
#include <stdlib.h>
#include <stdio.h>栈的基本操作
Status initStack(SeqStack *seqStack){seqStack->base = (ElementType *)malloc(sizeof(ElementType) * STACK_INIT_SIZE);if (!seqStack->base) {return 0;}seqStack->top = seqStack->base;seqStack->stacksize = STACK_INIT_SIZE;return 1;
}// 如果栈存在,销毁栈
void destroyStack(SeqStack *seqStack){free(seqStack->base);//释放栈基址的存储空间seqStack->base = seqStack->top = NULL;//栈顶和栈底置空seqStack->stacksize = 0;//栈大小置零
}void clearStack(SeqStack * seqStack){seqStack->top = seqStack->base;
}// 栈空
Status seqStackEmpty(SeqStack *seqStack){return seqStack->top == seqStack->base;
}// 栈的长度
int seqStackLength(SeqStack * seqStack){return seqStack->top - seqStack->base;
}// 获取栈顶元素
Status getSeqStackTop(SeqStack * seqStack,int *element){if (seqStack->top == seqStack->base) {return 0;}*element = *(seqStack->top - 1);return 1;
}// 入栈
Status push(SeqStack *seqStack,ElementType element){if (seqStack->top -seqStack->base >= seqStack->stacksize) {//栈满seqStack->base = (ElementType *)realloc(seqStack->base, (seqStack->stacksize + STACKINCREMENT) * sizeof(ElementType));if (!seqStack->base) {return 0;}seqStack->stacksize = seqStack->stacksize + STACKINCREMENT;seqStack->top = seqStack->base + seqStack->stacksize;}*seqStack->top++ = element;return 1;
}// 出栈
Status popSeqStack(SeqStack * seqStack,int * element){if (seqStack->top == seqStack->base) {//栈空return 0;}*element = * (--seqStack->top);return 1;
}void stackTraverse(SeqStack * seqStack){int *p = seqStack->base;while (p < seqStack->top) {printf("%d\t",*p++);}printf("\n");
}void testStack(void){SeqStack seqStack;printf("栈初始化中...");if (initStack(&seqStack)) {printf("栈初始化成功\n");}else{printf("栈初始化失败\n");}printf("入栈...\n");if (push(&seqStack, 1)) {printf("入栈成功\n");}if (push(&seqStack, 2)) {printf("入栈成功\n");}if (push(&seqStack, 3)) {printf("入栈成功\n");}printf("栈中元素:\n");stackTraverse(&seqStack);printf("栈的长度:%d\n",seqStackLength(&seqStack));if (!seqStackEmpty(&seqStack)) {printf("栈不为空\n");}int top;if (getSeqStackTop(&seqStack, &top)) {printf("栈顶元素获取成功\n");}printf("栈顶元素:%d\n",top);//出栈测试int element;if (popSeqStack(&seqStack, &element)) {printf("出栈成功,出栈元素为:%d\n",element);}if (popSeqStack(&seqStack, &element)) {printf("出栈成功,出栈元素为:%d\n",element);}if (popSeqStack(&seqStack, &element)) {printf("出栈成功,出栈元素为:%d\n",element);}printf("栈的长度:%d\n",seqStackLength(&seqStack));if (seqStackEmpty(&seqStack)) {printf("栈为空\n");}destroyStack(&seqStack);
}

二、队列

1.队列的概念

       队列是一种先进先出(FIFO)的线性表。它允只允许在表的一端进行插入,一端进行删除。允许插入的一端叫做队尾,允许删除的一端叫做队头。

        栈是一种具有特定操作的数据结构,它按照"先进后出"的原则存储和访问数据。栈具有两个基本操作,分别为入栈(push)和出栈(pop)。入栈将元素放入栈的顶部,出栈则将栈顶的元素取出。栈在计算机科学中广泛应用,例如函数调用、表达式求值、递归算法等。

2.队列的链式表示和实现

1.定义

//= = = = ADT Queue 的表示和实现 = = = =
//- - - - - 单链队列 队列的链式存储结构 - - - - -
typedef int  Status;
typedef int  QElemType;
typedef struct QNode{QElemType data;struct QNode * next;
}QNode,*QueuePtr;
typedef struct {QueuePtr front;    //  队头指针QueuePtr rear;     //  队尾指针
}LinkQueue;

2.初始化

        队列初始化的时候,队头和队尾相同。

//  队列初始化
Status initQueue(LinkQueue *queue) {queue->front = queue->rear = (QueuePtr)malloc(sizeof(QNode));if (!queue->front) {return 0; // 初始化失败}queue->front->next = NULL;return 1; // 初始化成功
}

3.销毁

          释放队列存储空间。

//  队列销毁
Status destroyQueue(LinkQueue *queue) {while (queue->front) {queue->rear = queue->front->next;free(queue->front);queue->front = queue->rear;}return 1; // 销毁成功
}

4.清空

//  队列清空
Status clearQueue(LinkQueue *queue) {QueuePtr p, q;queue->rear = queue->front;p = queue->front->next;queue->front->next = NULL;while (p) {q = p;p = p->next;free(q);}return 1; // 清空成功
}

5.空队列

        队头和队尾相同的时候为空队列。

//  队列判空
Status emptyQueue(LinkQueue *queue) {return queue->front == queue->rear;
}

6.队列长度

        比较栈顶和栈顶的指针

//  队列长度
Status queueLength(LinkQueue *queue) {int length = 0;QueuePtr p = queue->front;while (p != queue->rear) {length++;p = p->next;}return length;
}

7.获取队头

        获取队头元素。

//  队头元素
Status queueHead(LinkQueue *queue, QElemType *element) {if (emptyQueue(queue)) {return 0; // 队列为空}*element = queue->front->next->data;return 1; // 获取成功
}

8.入队

//  入队
Status enQueue(LinkQueue *queue, QElemType element) {QueuePtr p = (QueuePtr)malloc(sizeof(QNode));if (!p) {return 0; // 内存分配失败}p->data = element;p->next = NULL;queue->rear->next = p;queue->rear = p;return 1; // 入队成功
}

9.出队

//  出队
Status deQueue(LinkQueue *queue, QElemType *element) {if (emptyQueue(queue)) {return 0; // 队列为空}QueuePtr p = queue->front->next;*element = p->data;queue->front->next = p->next;if (queue->rear == p) {queue->rear = queue->front;}free(p);return 1; // 出队成功
}

 10.遍历队列

//  遍历队列
void traverseQueue(LinkQueue *queue) {QueuePtr p = queue->front->next;while (p) {printf("%d\t", p->data);p = p->next;}printf("\n");
}

11.完整代码

#include <stdio.h>
#include <stdlib.h>//= = = = ADT Queue 的表示和实现 = = = =
//- - - - - 单链队列 队列的链式存储结构 - - - - -
typedef int  Status;
typedef int  QElemType;
typedef struct QNode{QElemType data;struct QNode * next;
}QNode,*QueuePtr;
typedef struct {QueuePtr front;    //  队头指针QueuePtr rear;     //  队尾指针
}LinkQueue;
//  队列初始化
Status initQueue(LinkQueue *queue) {queue->front = queue->rear = (QueuePtr)malloc(sizeof(QNode));if (!queue->front) {return 0; // 初始化失败}queue->front->next = NULL;return 1; // 初始化成功
}//  队列销毁
Status destroyQueue(LinkQueue *queue) {while (queue->front) {queue->rear = queue->front->next;free(queue->front);queue->front = queue->rear;}return 1; // 销毁成功
}//  队列清空
Status clearQueue(LinkQueue *queue) {QueuePtr p, q;queue->rear = queue->front;p = queue->front->next;queue->front->next = NULL;while (p) {q = p;p = p->next;free(q);}return 1; // 清空成功
}//  队列判空
Status emptyQueue(LinkQueue *queue) {return queue->front == queue->rear;
}//  队列长度
Status queueLength(LinkQueue *queue) {int length = 0;QueuePtr p = queue->front;while (p != queue->rear) {length++;p = p->next;}return length;
}//  队头元素
Status queueHead(LinkQueue *queue, QElemType *element) {if (emptyQueue(queue)) {return 0; // 队列为空}*element = queue->front->next->data;return 1; // 获取成功
}//  入队
Status enQueue(LinkQueue *queue, QElemType element) {QueuePtr p = (QueuePtr)malloc(sizeof(QNode));if (!p) {return 0; // 内存分配失败}p->data = element;p->next = NULL;queue->rear->next = p;queue->rear = p;return 1; // 入队成功
}//  出队
Status deQueue(LinkQueue *queue, QElemType *element) {if (emptyQueue(queue)) {return 0; // 队列为空}QueuePtr p = queue->front->next;*element = p->data;queue->front->next = p->next;if (queue->rear == p) {queue->rear = queue->front;}free(p);return 1; // 出队成功
}//  遍历队列
void traverseQueue(LinkQueue *queue) {QueuePtr p = queue->front->next;while (p) {printf("%d\t", p->data);p = p->next;}printf("\n");
}
void testQueue(void){LinkQueue queue;initQueue(&queue);enQueue(&queue, 1);enQueue(&queue, 2);enQueue(&queue, 3);printf("队列中的元素: ");traverseQueue(&queue);int element;if (queueHead(&queue, &element)) {printf("队头元素为: %d\n", element);}printf("队列的长度为: %d\n", queueLength(&queue));printf("出队操作: ");while (!emptyQueue(&queue)) {deQueue(&queue, &element);printf("%d\t", element);}printf("\n");destroyQueue(&queue);
}int main(int argc, const char *argv[]) {testQueue();return 0;
}

3.队列的顺序表示和实现

1.定义

//- - - - - 队列的顺序存储结构 - - - - -
typedef int  Status;
typedef int  QElemType;
#define MAXSIZE 10
typedef struct {QElemType * base;   // 存储空间的基地址int front;          // 头指针int rear;           // 尾指针
}SeqQueue;

2.初始化

        队列初始化的时候,队头和队尾相同。

// 构造一个空队列
Status initSeqQueue(SeqQueue * seqQueue){seqQueue->base = (QElemType *)malloc(sizeof(QElemType) * MAXSIZE);if (!seqQueue->base) {return 0;}seqQueue->front = seqQueue->rear = 0;return 1;}

3.销毁

          释放队列存储空间。

// 销毁队列
Status destroySeqQueue(SeqQueue * seqQueue){free(seqQueue->base);seqQueue->base = NULL;seqQueue->front = seqQueue->rear = 0; // 头尾指针置零return 1;}

4.清空

// 清空队列
Status clearSeqQueue(SeqQueue * seqQueue){seqQueue->front = seqQueue->rear = 0;return 1;}

5.空队列

        队头和队尾相同的时候为空队列。

// 队空
Status seqQueueEmpty(SeqQueue * seqQueue){return seqQueue->front == seqQueue->rear;}

6.队列长度

        比较栈顶和栈顶的指针

// 队列长度
Status lengthQueue(SeqQueue * seqQueue){return seqQueue->rear - seqQueue->front;
}

7.获取队头

        获取队头元素。

// 获取队头元素
Status getSeqQueueFront(SeqQueue * seqQueue, QElemType *element){if (seqQueueEmpty(seqQueue)) {return 0; // 队列为空}*element = seqQueue->base[seqQueue->front];return 1; // 获取成功
}

8.入队

// 入队
Status enSeqQueue(SeqQueue *seqQueue, int element){if (seqQueue->rear == MAXSIZE) { // 队列已满return 0;}seqQueue->base[seqQueue->rear] = element;seqQueue->rear++;return 1;}

9.出队

// 出队
Status deSeqQueue(SeqQueue * seqQueue, QElemType *element){if (seqQueueEmpty(seqQueue)) {return 0; // 队列为空}*element = seqQueue->base[seqQueue->front];seqQueue->front++;return 1;}

 10.遍历队列

// 遍历队列
void queueTraverse(SeqQueue * seqQueue){if (seqQueueEmpty(seqQueue)) {printf("队列为空\n");return;}printf("队列元素为: ");for (int i = seqQueue->front; i < seqQueue->rear; i++) {printf("%d ", seqQueue->base[i]);}printf("\n");
}

11.完整代码

#import <Foundation/Foundation.h>
#include <stdlib.h>//- - - - - 队列的顺序存储结构 - - - - -
typedef int  Status;
typedef int  QElemType;
#define MAXSIZE 10
typedef struct {QElemType * base;   // 存储空间的基地址int front;          // 头指针int rear;           // 尾指针
}SeqQueue;// 构造一个空队列
Status initSeqQueue(SeqQueue * seqQueue){seqQueue->base = (QElemType *)malloc(sizeof(QElemType) * MAXSIZE);if (!seqQueue->base) {return 0;}seqQueue->front = seqQueue->rear = 0;return 1;}// 销毁队列
Status destroySeqQueue(SeqQueue * seqQueue){free(seqQueue->base);seqQueue->base = NULL;seqQueue->front = seqQueue->rear = 0; // 头尾指针置零return 1;}// 清空队列
Status clearSeqQueue(SeqQueue * seqQueue){seqQueue->front = seqQueue->rear = 0;return 1;}// 队空
Status seqQueueEmpty(SeqQueue * seqQueue){return seqQueue->front == seqQueue->rear;}// 队列长度
Status lengthQueue(SeqQueue * seqQueue){return seqQueue->rear - seqQueue->front;
}// 获取队头元素
Status getSeqQueueFront(SeqQueue * seqQueue, QElemType *element){if (seqQueueEmpty(seqQueue)) {return 0; // 队列为空}*element = seqQueue->base[seqQueue->front];return 1; // 获取成功
}// 入队
Status enSeqQueue(SeqQueue *seqQueue, int element){if (seqQueue->rear == MAXSIZE) { // 队列已满return 0;}seqQueue->base[seqQueue->rear] = element;seqQueue->rear++;return 1;}// 出队
Status deSeqQueue(SeqQueue * seqQueue, QElemType *element){if (seqQueueEmpty(seqQueue)) {return 0; // 队列为空}*element = seqQueue->base[seqQueue->front];seqQueue->front++;return 1;}// 遍历队列
void queueTraverse(SeqQueue * seqQueue){if (seqQueueEmpty(seqQueue)) {printf("队列为空\n");return;}printf("队列元素为: ");for (int i = seqQueue->front; i < seqQueue->rear; i++) {printf("%d ", seqQueue->base[i]);}printf("\n");
}int main(int argc, const char * argv[]) {SeqQueue seqQueue;printf("队列初始化中...\n");if (initSeqQueue(&seqQueue)) {printf("队列初始化成功\n");}else{printf("队列初始化失败\n");}printf("**********\t队列长度测试\t**********\n");if (seqQueueEmpty(&seqQueue)) {printf("队列为空,队列长度为:%d\n",lengthQueue(&seqQueue));}printf("**********\t入队测试\t**********\n");for (int i = 1; i<=3; i++) {if (enSeqQueue(&seqQueue,i)) {printf("数据元素%d入队成功\n",i);} else {printf("数据元素%d入队失败,队列已满\n",i);}}printf("**********\t队列长度测试\t**********\n");if (!seqQueueEmpty(&seqQueue)) {printf("队列不为空,队列长度为:%d\n",lengthQueue(&seqQueue));}printf("**********\t出队测试\t**********\n");QElemType element;while (!seqQueueEmpty(&seqQueue)) {if (deSeqQueue(&seqQueue, &element)) {printf("出队元素为: %d\n", element);}}return 0;
}

4.循环队列的顺序表示和实现

        在使用顺序表表示队列的时候,会出现假溢出的问题,为了解决这个问题,我们可以对顺序表加以修改,使用循环队列解决假溢出的问题。

1.定义

//- - - - - 队列的顺序存储结构 - - - - -
typedef int  Status;
typedef int  QElemType;
#define MAXSIZE 10
typedef struct {QElemType * base;   // 存储空间的基地址int front;          // 头指针int rear;           // 尾指针int count;          // 元素个数
}SeqQueue;

2.初始化

        队列初始化的时候,队头和队尾相同。

// 构造一个空队列
Status initSeqQueue(SeqQueue * seqQueue){seqQueue->base = (QElemType *)malloc(sizeof(QElemType) * MAXSIZE);if (!seqQueue->base) {return 0;}seqQueue->front = seqQueue->rear = 0;seqQueue->count = 0;return 1;}

3.销毁

          释放队列存储空间。

// 销毁队列
Status destroySeqQueue(SeqQueue * seqQueue){free(seqQueue->base);seqQueue->base = NULL;seqQueue->front = seqQueue->rear = 0; // 头尾指针置零seqQueue->count = 0;return 1;}

4.清空

// 清空队列
Status clearSeqQueue(SeqQueue * seqQueue){seqQueue->front = seqQueue->rear = 0;seqQueue->count = 0;return 1;}

5.空队列

        队头和队尾相同的时候为空队列。

// 队空
Status seqQueueEmpty(SeqQueue * seqQueue){return seqQueue->count == 0;}

6.队列长度

        比较栈顶和栈顶的指针

// 队列长度
Status lengthQueue(SeqQueue * seqQueue){return seqQueue->count;
}

7.获取队头

        获取队头元素。

// 获取队头元素
Status getSeqQueueFront(SeqQueue * seqQueue, QElemType *element){if (seqQueueEmpty(seqQueue)) {return 0; // 队列为空}*element = seqQueue->base[seqQueue->front];return 1; // 获取成功
}

8.入队

// 入队
Status enSeqQueue(SeqQueue *seqQueue, int element){if ((seqQueue->rear + 1) % MAXSIZE == seqQueue->front) { // 队列已满return 0;}seqQueue->base[seqQueue->rear] = element;seqQueue->rear = (seqQueue->rear + 1) % MAXSIZE;seqQueue->count++;return 1;}

9.出队

// 出队
Status  deSeqQueue(SeqQueue * seqQueue, QElemType *element){if (seqQueueEmpty(seqQueue)) {return 0; // 队列为空}*element = seqQueue->base[seqQueue->front];seqQueue->front = (seqQueue->front + 1) % MAXSIZE;seqQueue->count--;return 1;}

 10.遍历队列

// 遍历队列
void  queueTraverse(SeqQueue * seqQueue){if (seqQueueEmpty(seqQueue)) {printf("队列为空\n");return;}int i = seqQueue->front;printf("队列元素为: ");while (i != seqQueue->rear) {printf("%d ", seqQueue->base[i]);i = (i + 1) % MAXSIZE;}printf("\n");
}

11.完整代码

#import <Foundation/Foundation.h>
#include <stdlib.h>//- - - - - 队列的顺序存储结构 - - - - -
typedef int  Status;
typedef int  QElemType;
#define MAXSIZE 10
typedef struct {QElemType * base;   // 存储空间的基地址int front;          // 头指针int rear;           // 尾指针int count;          // 元素个数
}SeqQueue;// 构造一个空队列
Status initSeqQueue(SeqQueue * seqQueue){seqQueue->base = (QElemType *)malloc(sizeof(QElemType) * MAXSIZE);if (!seqQueue->base) {return 0;}seqQueue->front = seqQueue->rear = 0;seqQueue->count = 0;return 1;}// 销毁队列
Status destroySeqQueue(SeqQueue * seqQueue){free(seqQueue->base);seqQueue->base = NULL;seqQueue->front = seqQueue->rear = 0; // 头尾指针置零seqQueue->count = 0;return 1;}// 清空队列
Status clearSeqQueue(SeqQueue * seqQueue){seqQueue->front = seqQueue->rear = 0;seqQueue->count = 0;return 1;}// 队空
Status seqQueueEmpty(SeqQueue * seqQueue){return seqQueue->count == 0;}// 队列长度
Status lengthQueue(SeqQueue * seqQueue){return seqQueue->count;
}// 获取队头元素
Status getSeqQueueFront(SeqQueue * seqQueue, QElemType *element){if (seqQueueEmpty(seqQueue)) {return 0; // 队列为空}*element = seqQueue->base[seqQueue->front];return 1; // 获取成功
}// 入队
Status enSeqQueue(SeqQueue *seqQueue, int element){if ((seqQueue->rear + 1) % MAXSIZE == seqQueue->front) { // 队列已满return 0;}seqQueue->base[seqQueue->rear] = element;seqQueue->rear = (seqQueue->rear + 1) % MAXSIZE;seqQueue->count++;return 1;}// 出队
Status  deSeqQueue(SeqQueue * seqQueue, QElemType *element){if (seqQueueEmpty(seqQueue)) {return 0; // 队列为空}*element = seqQueue->base[seqQueue->front];seqQueue->front = (seqQueue->front + 1) % MAXSIZE;seqQueue->count--;return 1;}// 遍历队列
void  queueTraverse(SeqQueue * seqQueue){if (seqQueueEmpty(seqQueue)) {printf("队列为空\n");return;}int i = seqQueue->front;printf("队列元素为: ");while (i != seqQueue->rear) {printf("%d ", seqQueue->base[i]);i = (i + 1) % MAXSIZE;}printf("\n");
}int main(int argc, const char * argv[]) {SeqQueue seqQueue;printf("队列初始化中...\n");if (initSeqQueue(&seqQueue)) {printf("队列初始化成功\n");}else{printf("队列初始化失败\n");}printf("**********\t队列长度测试\t**********\n");if (seqQueueEmpty(&seqQueue)) {printf("队列为空,队列长度为:%d\n",lengthQueue(&seqQueue));}printf("**********\t入队测试\t**********\n");for (int i = 1; i<=MAXSIZE; i++) {if (enSeqQueue(&seqQueue,i)) {printf("数据元素%d入队成功\n",i);} else {printf("数据元素%d入队失败,队列已满\n",i);}}printf("**********\t队列长度测试\t**********\n");if (!seqQueueEmpty(&seqQueue)) {printf("队列不为空,队列长度为:%d\n",lengthQueue(&seqQueue));}printf("**********\t出队测试\t**********\n");QElemType element;while (!seqQueueEmpty(&seqQueue)) {if (deSeqQueue(&seqQueue, &element)) {printf("出队元素为: %d\n", element);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/8425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南

数字时代&#xff0c;人工智能&#xff08;AI&#xff09;及其相关技术正日益成为许多领域的热门话题。其中&#xff0c;生成式人工智能&#xff08;Gen AI&#xff09;和大型语言模型&#xff08;LLMs&#xff09;引起了广泛的兴趣和讨论。然而&#xff0c;尽管这些术语在科技…

哪些博客类型是最受欢迎的?

在创建博客时&#xff0c;您可能会想到的最常见的问题之一是哪些是最受欢迎的博客类型&#xff1f;有许多不同类型的博客涉及广泛的主题&#xff0c;兴趣和受众。对于一个成功的博客&#xff0c;你需要提前计划并选择适合你的利基市场。在本文中&#xff0c;我们将分享您可以立…

在IDEA中如何用Kafka进行异步处理

在IDEA的项目中使用Kafka进行异步处理 在项目的pom.xml文件中&#xff0c;添加以下依赖&#xff1a; <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.5.0</version> </dep…

旋转矩阵(将坐标轴旋转)

旋转矩阵&#xff08;将坐标轴旋转&#xff09; 在二维空间中&#xff0c;旋转可以用一个单一的角 定义。作为约定&#xff0c;正角表示逆时针旋转。把笛卡尔坐标的列向量关于原点逆时针旋转的矩阵是&#xff1a; 原坐标系下 坐标系逆时针旋转β 补充 sin(-a) -sin(a) co…

C++中的匿名对象

在C中&#xff0c;匿名对象指的是没有显式命名的临时对象。这些对象通常在表达式中创建并使用&#xff0c;然后很快就被销毁。匿名对象是一种非常有用的编程工具&#xff0c;它们可以用于简化代码、进行函数调用或者作为其他对象的初始化值。 特点和用途 立即销毁&#xff1a…

Python 正则表达式 re.match() 和 re.search() 方法

Python re.match 和 re.search 方法 正文re.match() 方法示例一示例二 re.search()示例一示例二 正文 re.match() 方法 调用方法&#xff1a; re.match(pattern, string, flags0)用法说明&#xff1a; 该函数在字符串的起始位置处进行匹配&#xff0c;若匹配到则返回该值&am…

Google Pixel4手机刷机+Root+逆向环境详细教程

Google Pixel4手机刷机Root逆向环境配置详细教程 刷机工具下载 Windows10、Google Pixel4手机当前安卓10系统、adb工具、要刷的谷歌原生的Android11最新刷机包、安装google usb驱动、美版临时twrp-3.6.0_11-0-flame.img和美版永久twrp-installer-3.6.0_11-0-flame.zip、Magis…

程序员有什么实用神器?

程序员的实用神器 在软件开发的海洋中&#xff0c;程序员的实用神器如同航海中的指南针&#xff0c;帮助他们导航、加速开发、优化代码质量&#xff0c;并最终抵达成功的彼岸。这些工具覆盖了从代码编写、版本控制到测试和部署的各个环节。 程序员常用的一些神器包括&#xf…

C++ map set

一.关联式容器 在初期学过的vector、list、deque、forward_list(C11)等&#xff0c;底层都为线性序列的序列式容器。 关联式容器是用来存储数据的&#xff0c;于序列式容器不同的是&#xff0c;里面存储的是<key,value>结构的键值对&#xff0c;在数据检索时比序列式容…

qiankun实现微前端,vue3为主应用,分别引入vue2和vue3微应用

1、vue3主应用配置 1、安装 qiankun yarn add qiankun # 或者 npm i qiankun -S2、在主应用中注册微应用 import { registerMicroApps, start } from "qiankun" const apps [{ name: vue2App, // 应用名称 xs_yiqing_vue2entry: //localhost:8080, // vue 应用…

apk一键换包名工具

工作需要 手动撸了个一键换包名的工具 1 给AndroidManifest.xml修改包名(修改完成后会覆盖原来的文件) java -jar xmleditor-1.0.jar -pkg [AndroidMainifest.xml] 2 给apk修改包名(修改完成后会在当前目录下生成一个新的apk) java -jar xmleditor-1.0.jar -pkgapk [xxx.ap…

C语言(递归)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

数据结构——实现通讯录(附源码)

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

layui的treeTable组件,多层级上传按钮失效的问题解决

现象描述: layui的treeTable 的上传按钮在一层能用&#xff0c;展开后其他按钮正常点击&#xff0c;上传按钮无效。 具体原因没有深究&#xff0c;大概率是展开的子菜单没有被渲染treeTable的done管理到&#xff0c;导致没有重绘上传按钮。 解决方案: 不使用layu的上传组件方法…

C语言常见的动态内存错误及几个经典笔试题以及c/c++内存开辟空间等的介绍

文章目录 前言一、常见的动态内存错误1. 对NULL指针的解引用操作2. 对动态开辟空间的越界访问3. 对非动态开辟内存使用free()4. 使用free释放一块动态开辟内存的一部分5. 对同一块动态内存多次释放6. 动态开辟内存忘记释放&#xff08;内存泄漏&#xff09; 二、几个经典笔试题…

rust容器、迭代器

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;点击跳转 目录 一&#xff0c;std容器 1&#xff0c;Vec&#xff08;向量、栈&#xff09; 2&#xff0c;VecDeque&#xff08;队列、双端队…

邦注科技 模具保护器 CCD电子眼 专业工业视觉检测设备

模具保护器是一种用于保护模具的设备&#xff0c;可以在塑料压铸和冲床等加工过程中起到保护模具的作用。以下是关于模具保护器在保护塑料压铸和冲床模具方面的应用&#xff1a; 塑料压铸模具保护器&#xff1a; 防止碰撞&#xff1a;在塑料压铸过程中&#xff0c;模具可能会…

Vue 3中,`toRef` 和 `toRefs`

在Vue 3中&#xff0c;toRef 和 toRefs 是两个帮助函数&#xff0c;它们用于从 reactive 对象中提取出响应式的引用。这两个函数在处理复杂的响应式状态或者在组合式API中非常有用。 ### toRef toRef 创建一个 ref 对象&#xff0c;它是一个对于 reactive 对象中某个属性的响…

MindSponge分子动力学模拟——安装与使用

技术背景 昇思MindSpore是由华为主导的一个&#xff0c;面向全场景构建最佳昇腾匹配、支持多处理器架构的开放AI框架。MindSpore不仅仅是软件层面的工具&#xff0c;更重要的是可以协同华为自研的昇腾Ascend平台&#xff0c;做到软硬件一体的行业解决方案。基于MindSpore的高通…

解析源代码安全的防泄密解决途径

随着各行各业业务数据信息化发展&#xff0c;各类产品研发及设计等行业&#xff0c;都有关乎自身发展的核心数据&#xff0c;包括业务数据、代码数据、机密文档、用户数据等敏感信息&#xff0c;这些信息数据有以下共性&#xff1a; 属于核心机密资料&#xff0c;万一泄密会对…