如何获取周至地区做网站建筑公司的二级资质?
摘要:周至做网站,建筑公司二级资质要求,下载app,长春做网站公司长春网站排名🚀write in front🚀 📝个人主页&#xff1
周至做网站,建筑公司二级资质要求,下载app,长春做网站公司长春网站排名#x1f680;write in front#x1f680; #x1f4dd;个人主页#xff1a;认真写博客的夏目浅石. #x1f381;欢迎各位→点赞#x1f44d; 收藏⭐️ 留言#x1f4dd; #x1f4e3;系列专栏#xff1a;C语言实现数据结构 #x1f4ac;总结#xff1a;希望你看完… write in front 个人主页认真写博客的夏目浅石. 欢迎各位→点赞 收藏⭐️ 留言 系列专栏C语言实现数据结构 总结希望你看完之后能对你有所帮助不足请指正共同学习交流 ✉️如果无聊的话就来逛逛我的博客栈吧stack-frame.cn 文章目录前言一、栈的概念二、栈的结构三、栈的实现3.1 结构设计3.2 接口总览3.3 初始化3.4 销毁3.5 判断栈是否为空3.6 入栈3.7 出栈3.8 取栈顶元素3.9 计算栈的大小四、 完整代码Stack.hStack.ctest.c总结前言
这几天看了数据结构的栈这一节真的收获很大第一次看没有动手敲代码就是感觉学了和没学一样今天也是从新又看了一遍并且边学边敲代码终于算是非常理解栈这个东西了今天就把我所学到的知识给大家分享一下。 一、栈的概念
栈 是一个特殊的 线性表
栈只允许在固定的一段进行插入和删除元素的操作。进行数据插入和删除操作的一端称为栈顶不进行操作的一端称为栈底
栈中的元素遵守 后进先出 (LIFO - Last In First Out) 的原则。也就是先进的后出后进的先出
栈对于数据的管理主要有两种操作
压栈栈的插入操作叫做进栈 / 压栈 / 入栈从栈顶进行压栈。出栈栈的删除操作叫做 出栈从栈顶进行出栈。
二、栈的结构
栈一般可以使用 数组或链表 实现。让我们分析一下使用这两种方法实现栈的结构分别是什么样的。
在分析之前我们要明确的一点是栈只对 栈顶 的元素进行操作。
那么对于 顺序栈 和 链式栈 那个更加好呢那必定是 顺序栈因为使用顺序栈的 尾插尾删非常方便 且 cpu缓存利用率也更高。而且对于顺序栈实现起来相对简单所以我们接下来就实现 顺序栈 。
三、栈的实现
3.1 结构设计
我们既然是实现 顺序栈那么它的结构肯定就和 顺序表 差不多
typedef struct Stack
{STDatatype* a; // 指向动态开辟的数组int capacity; // 栈的容量int top; // 标识 栈顶的下一个位置的下标 或 栈顶的下标
}ST;
这里的 top 我们需要好好理解一下。当top的初始值不同时top可以表示 栈顶的下一个位置的下标 或 栈顶下标。
当 top 0top 表示栈顶的下一个位置的下标 2. 当 top -1top 表示栈顶的下标 top 初始值为 -1那么需要先 top再压栈。否则会越界。当 最后一次压栈时为先 top 再压栈top 最后的位置就是栈顶的下标处。
3.2 接口总览
void StackInit(ST* ps); // 初始化
void StackDestroy(ST* ps); // 销毁
void StackPush(ST* ps, STDatatype x); // 压栈
void StackPop(ST* ps); // 出栈
STDatatype StackTop(ST* ps); // 取栈顶元素
bool StackEmpty(ST* ps); // 判空
int StackSize(ST* ps); // 计算栈的大小
3.3 初始化
我们实现的是顺序栈那么就和顺序表一样需要创建结构体变量传结构体的地址进行初始化。
在初始化的时候就给栈开上四个单位的空间并且将起始容量设定为4。
注意了我们这里设定的 top 0那么表示 top 为栈顶的下一个位置的下标。
void StackInit(ST* ps)
{// 结构体一定不为空所以需要断言assert(ps);ps-a (STDatatype*)malloc(sizeof(STDatatype) * 4);if (ps-a NULL){perror(malloc fail);exit(-1);}ps-capacity 4;ps-top 0;
}
3.4 销毁
对于栈的销毁那么我们就只需要释放动态开辟的空间将指针置空。并将 capacity 和 top 两个变量置 0即可。
void StackDestroy(ST* ps)
{assert(ps);free(ps-a);ps-a NULL;ps-capacity ps-top 0;
}
3.5 判断栈是否为空
我们起初设定 top 0所以判断栈是否为空那么只需要看 top 是否为0就可以了。如果为0返回真 不为0返回假。
bool StackEmpty(ST* ps)
{assert(ps);// 如果 ps-top 0返回真// 如果 ps-top !0返回假return ps-top 0;
}
3.6 入栈
void StackPush(ST* ps, STDatatype x)
{assert(ps);// 检查容量if (ps-top ps-capacity){STDatatype* tmp (STDatatype*)realloc(ps-a, sizeof(STDatatype) * ps-capacity * 2);if (tmp NULL){perror(realloc fail);exit(-1);}ps-a tmp;ps-capacity * 2;}// 插入元素// top 为栈顶的下一个元素// 先插入再 ps-a[ps-top] x;ps-top;
}
3.7 出栈
void StackPop(ST* ps)
{assert(ps);// 如果栈空则不能删除assert(!StackEmpty(ps));ps-top--;
}
3.8 取栈顶元素
STDatatype StackTop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));return ps-a[ps-top - 1];
}
3.9 计算栈的大小
int StackSize(ST* ps)
{assert(ps);return ps-top;
}
四、 完整代码
Stack.h
#pragma once#include stdbool.h
#include stdio.h
#include assert.h
#include stdlib.htypedef int STDatatype;typedef struct Stack
{STDatatype* a;int capacity;int top; // 初始为0表示栈顶位置下一个位置下标// 初始为-1表示栈顶位置的下标
}ST;void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDatatype x);
void StackPop(ST* ps);
STDatatype StackTop(ST* ps);
bool StackEmpty(ST* ps);
int StackSize(ST* ps);
Stack.c
#define _CRT_SECURE_NO_WARNINGS 1 #include Stack.h// top 为栈顶 初识值为 -1void StackInit(ST* ps)
{// 结构体一定不为空assert(ps);ps-a (STDatatype*)malloc(sizeof(STDatatype) * 4);if (ps-a NULL){perror(malloc fail);exit(-1);}ps-capacity 4;ps-top -1;
}void StackDestroy(ST* ps)
{assert(ps);free(ps-a);ps-a NULL;ps-capacity ps-top 0;
}void StackPush(ST* ps, STDatatype x)
{assert(ps);// 检查容量// 此时 top 一开始为 -1不能表示栈中元素的数目// top 1 才是正确的if (ps-top 1 ps-capacity){STDatatype* tmp (STDatatype*)realloc(ps-a, sizeof(STDatatype) * ps-capacity * 2);if (tmp NULL){perror(realloc fail);exit(-1);}ps-a tmp;ps-capacity * 2;}// 插入元素// top 为栈顶元素// 先 再插入ps-a[ps-top] x;
}void StackPop(ST* ps)
{assert(ps);// 如果栈空则不能删除assert(!StackEmpty(ps));ps-top--;
}STDatatype StackTop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));return ps-a[ps-top];
}bool StackEmpty(ST* ps)
{assert(ps);return ps-top -1;
}int StackSize(ST* ps)
{assert(ps);return ps-top 1;
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include Stack.hvoid TestST1()
{ST st;StackInit(st);StackPush(st, 1);StackPush(st, 2);StackPush(st, 3);StackPush(st, 4);StackPush(st, 5);StackPop(st);StackPop(st);printf(%d\n, StackTop(st));
}int main()
{TestST1();
}
总结 今天学习了栈的知识初次写数据结构的知识给我的感觉就是学三遍不如手敲代码一遍来的实在所以数据结构的学习我将多画图多敲代码来学习希望大家吸取经验和我一起学习数据结构为后面打比赛刷题打下坚实基础。 我是夏目浅石希望和你一起学习进步刷题无数希望各位大佬能一键三连支持一下博主hhhh~我们下期见喽 如果无聊的话就来逛逛我的博客栈吧stack-frame.cn ✨原创不易还希望各位大佬支持一下\textcolor{blue}{原创不易还希望各位大佬支持一下}原创不易还希望各位大佬支持一下 点赞你的认可是我创作的动力\textcolor{9c81c1}{点赞你的认可是我创作的动力}点赞你的认可是我创作的动力 ⭐️ 收藏你的青睐是我努力的方向\textcolor{ed7976}{收藏你的青睐是我努力的方向}收藏你的青睐是我努力的方向 ✏️ 评论你的意见是我进步的财富\textcolor{98c091}{评论你的意见是我进步的财富}评论你的意见是我进步的财富
