保定网站建设保定徐州模板建站哪家好
保定网站建设保定,徐州模板建站哪家好,温州企业建站系统,asp 英文企业网站 免费#x1f493;作者简介#x1f389;#xff1a;在校大二迷茫大学生 #x1f496;个人主页#x1f389;#xff1a;小李很执着 #x1f497;系列专栏#x1f389;#xff1a;数据结构 每日分享✨#xff1a;到头来#xff0c;有意义的并不是结果#xff0c;而是我们度… 作者简介在校大二迷茫大学生 个人主页小李很执着 系列专栏数据结构 每日分享✨到头来有意义的并不是结果而是我们度过的那些无可替代的时间❣️❣️❣️ 目录
1.栈
1.栈的概念及结构
2.栈的实现 3.代码实现
1.总体实现
2.详细解析
1.栈的初始化 2.释放了动态数组中的空间
3.入栈操作
4. 栈顶元素删除 5.获取栈顶元素 6.判断栈ST是否为空 7.获取栈大小
3.整体代码 1.Stack.h
2.Stach.c
3.test.c 2.队列
1.队列的概念及结构 2.队列的实现
3.代码实现
1.总体实现
2. 详细解析
1.初始化队列
2.销毁队列
3.往队列中插入一个元素
4.队列的出队
5.获取队列头部元素
6.获取队列最后一个元素
7.判断队列是否为空
8.获取队列当前元素数量
3.整体代码
1.Queue.h
2.Queue.c
3.Test.c 1.栈
1.栈的概念及结构 栈一种特殊的线性表其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶另一端称为栈底。栈中的数据元素遵守后进先出LIFOLast In First Out的原则。 压栈栈的插入操作叫做进栈/压栈/入栈入数据在栈顶。 出栈栈的删除操作叫做出栈。出数据也在栈顶。 2.栈的实现 栈的实现一般可以使用数组或者链表实现相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。 3.代码实现
1.总体实现 1.栈的初始化 void STInit(ST* pst); 2.释放了动态数组中的空间 void STDestroy(ST* pst); 3.入栈操作 void STPush(ST* pst, STDataType x); 4. 栈顶元素删除 void STPop(ST* pst); 5.获取栈顶元素 STDataType STTop(ST* pst); 6.判断栈ST是否为空 bool STEmpty(ST* pst); 7.获取栈大小 int STSize(ST* pst); 2.详细解析
1.栈的初始化
void STInit(ST* pst)
{assert(pst);pst-a NULL;pst-capacity 0;// 表示top指向栈顶元素的下一个位置pst-top 0;// 表示top指向栈顶元素//pst-top -1;
} 这是一个栈的初始化函数函数定义如下 void STInit(ST* pst);其中ST是一个结构体类型包含栈元素的数组指针a栈的容量capacity以及指向栈顶元素的下一个位置的指针top。 函数内部的实现如下 assert(pst); // 检查指针参数是否为NULLpst-a NULL; // 初始化栈元素数组指针为NULL
pst-capacity 0; // 初始化栈的容量为0// 表示top指向栈顶元素的下一个位置
pst-top 0;// 表示top指向栈顶元素
//pst-top -1;函数内部的注释提供了两种实现方式表示top指针的指向方式 pst-top 0; 表示top指向栈顶元素的下一个位置。例如初始状态下栈被认为是空的因此top指向数组的第一个位置即下标为0的位置。 pst-top -1; 表示top指向栈顶元素。例如初始状态下栈被认为是空的因此top指向数组最后一个位置即下标为capacity-1的位置。在这种情况下当向栈中压入第一个元素时需要先将top指向0表示栈中有一个元素而不是-1。 2.释放了动态数组中的空间
void STDestroy(ST* pst)
{assert(pst);free(pst-a);pst-a NULL;pst-top pst-capacity 0;
} 该函数释放了动态数组中的空间并将栈中保存的指针置为 NULL防止出现悬挂指针的情况。 具体分析 assert(pst); 该语句使用 assert 宏函数判断传入的指针 pst 是否为空如果为空将会出现错误。 free(pst-a); 该语句使用 free 函数释放了动态数组 a 所占用的空间。 pst-a NULL; 将栈中保存的数组指针 a 置为 NULL防止出现悬挂指针的情况。 pst-top pst-capacity 0; 将栈中保存的元素数量 top 和数组容量 capacity 置为 0表示栈已经被清空了。 3.入栈操作 该函数用于将元素x压入栈中。 函数中的assert(pst)用于确保输入的栈指针pst不为空。 当栈已满时需要重新分配更大的内存空间以存储更多的元素。在这里使用动态内存分配函数realloc()来重新分配空间。如果分配失败则会输出错误信息并返回。 当空间分配成功后元素x将被添加到栈的顶部pst-top会自增表示该栈顶指针已向上移动一位。 最后该函数会在操作完成后返回。 void STPush(ST* pst, STDataType x)
{assert(pst);if (pst-top pst-capacity){int newcapacity pst-capacity 0 ? 4 : pst-capacity * 2;STDataType* tmp (STDataType*)realloc(pst-a, sizeof(STDataType) * newcapacity);if (tmp NULL){perror(realloc fail);return;}pst-a tmp;pst-capacity newcapacity;}pst-a[pst-top] x;pst-top;
}
4. 栈顶元素删除
首先使用assert宏函数对传入的指针pst进行断言确保其不为空。然后再次使用assert宏函数判断栈顶指针top是否大于0确保栈中有元素可以弹出。最后将top指针减1实现弹出栈顶元素的操作。 void STPop(ST* pst)
{assert(pst);// 不为空assert(pst-top 0);pst-top--;
}5.获取栈顶元素 首先使用断言assert判断指针是否为空如果为空则程序会崩溃。接着判断栈顶是否大于0如果不大于0则说明栈中无元素也会导致程序崩溃。最后返回栈顶元素由于是取栈顶元素所以要使用栈顶指针top减1来访问栈顶元素。 STDataType STTop(ST* pst)
{assert(pst);// 不为空assert(pst-top 0);return pst-a[pst-top - 1];
} 6.判断栈ST是否为空 函数中的参数 pst 是一个指向栈的指针使用 assert 宏对其进行断言确保其不为空。 这个函数主要通过判断栈顶指针top是否为 0 来确定栈是否为空。如果 top 等于 0那么栈中没有任何元素函数返回 true表示栈为空否则返回 false表示栈中还有元素。 bool STEmpty(ST* pst)
{assert(pst);return pst-top 0;
}7.获取栈大小 栈的大小是指当前栈中元素的数量。 参数pst是一个指向栈的指针函数内部调用了assert(pst)来判断指针是否为空如果为空则直接终止程序的执行。 函数返回值为栈的大小即栈顶指针top的值。在使用该函数之前需要确保栈已经被初始化。 int STSize(ST* pst)
{assert(pst);return pst-top;
}
3.整体代码 1.Stack.h
#pragma once
#includestdio.h
#includeassert.h
#includestdlib.h
#includestdbool.htypedef int STDataType;typedef struct Stack
{STDataType* a;int top; // 标识栈顶位置的int capacity;
}ST;void STInit(ST* pst);
void STDestroy(ST* pst);// 栈顶插入删除
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
STDataType STTop(ST* pst);bool STEmpty(ST* pst);
int STSize(ST* pst);2.Stach.c
#includeStack.hvoid STInit(ST* pst)
{assert(pst);pst-a NULL;pst-capacity 0;// 表示top指向栈顶元素的下一个位置pst-top 0;// 表示top指向栈顶元素//pst-top -1;
}void STDestroy(ST* pst)
{assert(pst);free(pst-a);pst-a NULL;pst-top pst-capacity 0;
}// 栈顶插入删除
void STPush(ST* pst, STDataType x)
{assert(pst);if (pst-top pst-capacity){int newcapacity pst-capacity 0 ? 4 : pst-capacity * 2;STDataType* tmp (STDataType*)realloc(pst-a, sizeof(STDataType) * newcapacity);if (tmp NULL){perror(realloc fail);return;}pst-a tmp;pst-capacity newcapacity;}pst-a[pst-top] x;pst-top;
}void STPop(ST* pst)
{assert(pst);// 不为空assert(pst-top 0);pst-top--;
}STDataType STTop(ST* pst)
{assert(pst);// 不为空assert(pst-top 0);return pst-a[pst-top - 1];
}bool STEmpty(ST* pst)
{assert(pst);/*if (pst-top 0){return true;}else{return false;}*/return pst-top 0;
}int STSize(ST* pst)
{assert(pst);return pst-top;
}
3.test.c
#includeStack.hint main()
{ST s;STInit(s);STPush(s, 1);STPush(s, 2);STPush(s, 3);printf(%d , STTop(s));STPop(s);printf(%d , STTop(s));STPop(s);STPush(s, 4);STPush(s, 5);// 一 对 多// 入栈顺序 -- 出栈顺序while (!STEmpty(s)){printf(%d , STTop(s));STPop(s);}printf(\n);return 0;
} 2.队列
1.队列的概念及结构 队列只允许在一端进行插入数据操作在另一端进行删除数据操作的特殊线性表队列具有先进先出 FIFO(First In First Out) 入队列进行插入操作的一端称为队尾 出队列进行删除操作的一端称为队头 2.队列的实现 队列也可以数组和链表的结构实现使用链表的结构实现更优一些因为如果使用数组的结构出队列在数组头上出数据效率会比较低。
3.代码实现
1.总体实现 void QueueInit(Queue* pq); void QueueDestroy(Queue* pq); void QueuePush(Queue* pq, QDataType x); void QueuePop(Queue* pq); QDataType QueueFront(Queue* pq); QDataType QueueBack(Queue* pq); bool QueueEmpty(Queue* pq); int QueueSize(Queue* pq); 2. 详细解析
1.初始化队列 参数是一个指向Queue结构体的指针。 首先利用assert()函数检查pq指针是否为空若为空则程序会终止运行避免出现不可预知的错误。 然后将队列的头指针phead和尾指针ptail都置为空即队列初始时是空的。队列的大小size也被初始化为0表示队列中没有元素。 整个函数的逻辑比较简单主要目的是将队列的各个成员变量初始化为合适的初始值以便后续实现队列的相关操作。 void QueueInit(Queue* pq)
{assert(pq);pq-phead pq-ptail NULL;pq-size 0;
}
2.销毁队列 参数是一个指向队列的指针。 首先使用 assert 函数检查指针 pq 是否为空如果为空则程序直接终止。 然后定义一个指针 cur 指向队列头部元素。使用 while 循环遍历整个队列将 cur 的下一个元素指向 next再将 cur 释放掉。cur 等于 next继续遍历。 最后将队列的头部指针 pq-phead 和尾部指针 pq-ptail 都指向 NULL队列大小 pq-size 置为 0。 这个函数的作用是遍历整个队列逐个释放节点所占用的空间防止内存泄漏。 void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur pq-phead;while (cur){QNode* next cur-next;free(cur);cur next;}pq-phead pq-ptail NULL;pq-size 0;
}
3.往队列中插入一个元素 函数参数说明 - pq指向队列的指针需要保证指针非空。 - x插入队列的元素值。 函数实现 1. 判断指向队列的指针是否为空如果为空则直接返回。 2. 申请一个新节点并判断申请是否成功。如果申请失败则打印错误信息并返回。 3. 设置新节点的值为要插入的元素值x将新节点的next指针置为NULL。 4. 如果队列为空则将队列的头指针和尾指针都指向新节点。 5. 如果队列非空则将尾节点的next指针指向新节点然后将尾节点指针指向新节点。 6. 更新队列的元素数量。 7. 函数结束。 void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode (QNode*)malloc(sizeof(QNode));if (newnode NULL){perror(malloc fail);return;}newnode-val x;newnode-next NULL;if (pq-ptail NULL){pq-ptail pq-phead newnode;}else{pq-ptail-next newnode;pq-ptail newnode;}pq-size;
}4.队列的出队 第一行代码使用断言(assert)来确保队列指针pq的非空性若为空则会停止程序运行。 第二行代码使用断言(assert)来确保队列头指针(pq-phead)的非空性若为空则会停止程序运行。 第三行代码定义一个结构体指针del用来指向将要被删除的节点。 第四行代码将队列头指针(pq-phead)指向下一个节点即将队头出队并将该节点的内存释放。 第五至八行代码判断队列是否为空队列如果是则将队尾指针(pq-ptail)也置为空指针否则不需要做任何操作。 最后一行代码将队列的大小(size)减少1。 void QueuePop(Queue* pq)
{assert(pq);// assert(pq-phead);QNode* del pq-phead;pq-phead pq-phead-next;free(del);del NULL;if (pq-phead NULL)pq-ptail NULL;pq-size--;
}5.获取队列头部元素 输入参数为一个指向队列的指针pq返回值为队列头部元素的值。其中使用了assert宏来进行断言确保pq和pq-phead都不为NULL如果其中任意一个为NULL则会触发断言失败程序会崩溃。最后返回pq-phead的值。 QDataType QueueFront(Queue* pq)
{assert(pq);// assert(pq-phead);return pq-phead-val;
}6.获取队列最后一个元素 函数签名说明 QDataType是一个数据类型用于表示队列中元素的类型Queue是一个结构体类型表示队列Queue* pq表示指向队列的指针。 函数实现 首先使用assert()宏函数对传入的参数进行断言处理确保指针pq和队列的尾指针ptail都不为空。 然后返回队列尾部节点即最后一个元素的值即pq-ptail-val。由于队列的尾指针指向的就是队列的尾部节点所以可以直接通过ptail获取队列尾部节点的值。 整个函数逻辑简单实现了获取队列最后一个元素的功能。 QDataType QueueBack(Queue* pq)
{assert(pq);// assert(pq-ptail);return pq-ptail-val;
}
7.判断队列是否为空 参数pq是一个指向Queue类型的指针assert(pq)用于判断pq是否为空。函数返回队列的头节点是否为空如果为空则队列为空返回true否则返回false。 bool QueueEmpty(Queue* pq)
{assert(pq);return pq-phead NULL;
}8.获取队列当前元素数量 它接受一个指向队列结构体的指针作为参数。 第一行使用了assert宏它会检查参数pq是否为空指针如果是则程序会中止运行并输出错误信息。 第三行直接返回队列结构体中的size成员即队列当前的元素数量。 int QueueSize(Queue* pq)
{assert(pq);return pq-size;
}
3.整体代码
1.Queue.h
#pragma once
#includestdio.h
#includeassert.h
#includestdlib.h
#includestdbool.htypedef int QDataType;
typedef struct QueueNode
{QDataType val;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
void QueuePush(Queue* pq, QDataType x);
void QueuePop(Queue* pq);
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);
bool QueueEmpty(Queue* pq);
int QueueSize(Queue* pq);2.Queue.c
#includeQueue.hvoid QueueInit(Queue* pq)
{assert(pq);pq-phead pq-ptail NULL;pq-size 0;
}void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur pq-phead;while (cur){QNode* next cur-next;free(cur);cur next;}pq-phead pq-ptail NULL;pq-size 0;
}void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode (QNode*)malloc(sizeof(QNode));if (newnode NULL){perror(malloc fail);return;}newnode-val x;newnode-next NULL;if (pq-ptail NULL){pq-ptail pq-phead newnode;}else{pq-ptail-next newnode;pq-ptail newnode;}pq-size;
}// 17:10
void QueuePop(Queue* pq)
{assert(pq);// assert(pq-phead);QNode* del pq-phead;pq-phead pq-phead-next;free(del);del NULL;if (pq-phead NULL)pq-ptail NULL;pq-size--;
}QDataType QueueFront(Queue* pq)
{assert(pq);// assert(pq-phead);return pq-phead-val;
}QDataType QueueBack(Queue* pq)
{assert(pq);// assert(pq-ptail);return pq-ptail-val;
}bool QueueEmpty(Queue* pq)
{assert(pq);return pq-phead NULL;
}int QueueSize(Queue* pq)
{assert(pq);return pq-size;
}
3.Test.c
#includeQueue.hint main()
{Queue q;QueueInit(q);QueuePush(q, 1);QueuePush(q, 2);QueuePush(q, 3);printf(%d , QueueFront(q));QueuePop(q);printf(%d , QueueFront(q));QueuePop(q);QueuePush(q, 4);QueuePush(q, 5);while (!QueueEmpty(q)){printf(%d , QueueFront(q));QueuePop(q);}QueueDestroy(q);return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/85708.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!