当前位置: 首页 > news >正文

专门做外卖的网站百度一下生活更好

专门做外卖的网站,百度一下生活更好,建筑网站的研究背景与意义,帮人家做网站维护目录 一、什么是栈? 二、创建一个我们自己的栈 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口的实现 2.1初始化栈结构体 2.2尾插(压栈) 2.3栈存放的元素个数和判断栈是否为空 2.4获取栈顶元素 2.5出栈 2.6摧毁栈 2.7测试接口 三、…

目录

一、什么是栈?

二、创建一个我们自己的栈

1.前置准备

1.1需要的三个文件

 1.2结构体的创建和头文件的引用

 2.接口的实现

2.1初始化栈结构体

2.2尾插(压栈)

2.3栈存放的元素个数和判断栈是否为空

2.4获取栈顶元素

2.5出栈

2.6摧毁栈

2.7测试接口

三、所有代码

1.接口实现

2.栈的头文件

3.测试代码


一、什么是栈?

栈是计算机科学中的一种数据结构,它是一种线性结构,按照先进后出的原则进行存储和访问。栈通常也称作堆栈、堆叠或简称电梯。

在栈中,添加或删除元素只能在同一端进行,这一端被称为栈顶。当向栈顶添加一个元素时,我们称之为入栈;当从栈顶删除一个元素时,我们称之为出栈。对于栈的一项重要特性是,每次只能访问位于栈顶的元素,因此栈是不支持随机访问的数据结构。栈和我们之前所学习过的顺序表很相似,区别就在于,顺序表支持尾插尾删,头插头删,而栈只支持后进先出也就是只支持尾插尾删。它就像一个竖井,当队伍走进这个井后,要退出来也只能是队伍的末端最先退出。这里博主给大家画了张图,方便大家好理解。

二、创建一个我们自己的栈

1.前置准备

1.1需要的三个文件

在开始之前,我们最好创建三个文件,一个放栈函数的实现,一个用来测试栈函数,最后一个放栈函数的引用和头文件的引用,这样到时侯想要使用栈函数直接包这一个头文件即可。创建完之后,呈现出来的效果与下图差不多即可。

 1.2结构体的创建和头文件的引用

在进行操作之前,我们先在存放头文件和栈函数的文件中包几个常用的头文件,并且定义一下栈的结构体类型,栈只需要后进先出,也就是尾插尾删,那么使用数组亦或者使用链表实现难度是差不多的,这里我们使用数组实现。

使用数组实现要注意的便是,我们应该使用数组指针的形式实现,而不是单纯就一个数组,如果单纯就一个数组 ,就是一个静态的栈空间,而静态的栈空间在实际中几乎是没有任何用处的,这里我们要实现的是动态的。既然要实现的是动态的,那么我们应该想办法存储一下数组存放的元素个数,以及这个数组的容量大小,这样才能够判断出这个栈空间是否满了,从而根据需求扩大空间。因此我们创建的结构体应该要有一个数组指针,一个存放容量的大小,一个存放数组里面已经存放的元素个数。

最后呈现出来的差不多就是这个样子

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int STDateType;
//到时修改类型时只用改这里的一个就可以,不需要一个个修改
//同样,这也是为了和单一的int作区分
typedef struct stack
{STDateType* stack;//栈空间int top;//已经存放的元素个数int capacity;//容量大小
}ST;//创建栈的结构体,并将它的名字自定义为ST

 2.接口的实现

2.1初始化栈结构体

初始化栈结构体,一共有三步,第一步是将栈空间的空间开辟好,第二步是初始化栈结构体的容量,最后一步初始化栈结构体中存放元素个数的变量。

void init_stack(ST* s1)
{assert(s1);//传过来的是一个指针,不应该是空指针,空指针无法操作,故断言s1->stack = (STDateType*)malloc(sizeof(STDateType)*4);//将栈空间初始化成只可以存放4个元素的空间if (s1->stack == NULL){perror("init_stack");//如果连基本的初始化都完成失败,就没有进行下去的必要了exit(-1);}s1->capacity = 4;//容量初始化成4s1->top = 0;//已经存放的元素个数初始化为0
}

2.2尾插(压栈)

压栈需要注意的一点便是,当栈满了的时候我们应该要考虑扩容

void push_stack(ST* s1, STDateType x)
{assert(s1);if (s1->capacity == s1->top)//空间满了,要扩容{int newcapacity = (s1->capacity) * 2;//扩容至原来的两倍s1->stack=(STDateType*)realloc(s1->stack, sizeof(STDateType)*newcapacity);if (s1->stack == NULL){perror("push_stack");exit(-1);//扩容失败也别玩了}s1->capacity = newcapacity;//扩容成功,容量改变}s1->stack[s1->top] = x;//压栈s1->top++;//压栈成功,存放的元素个数+1
}

2.3栈存放的元素个数和判断栈是否为空

可能有小伙伴不明白为什么又要设计这两个接口,因为这两个信息都可以直接通过栈的结构体获得,好像没什么作用啊。设计这两个接口并使用它们而不是直接通过结构体的内容来判断是因为,当我们的需求发生改变了,所创建的结构体可能也会跟着修改,可能提取的方式会发生一些改变。如果我们在使用栈的时候已经直接通过结构体的内容进行了多次的判断,那么我们要修改起来,要修改多次,很不方便,这样做的好处就是只用修改一次即可。

栈存放的元素个数

int size_stack(ST* s1)
{assert(s1);return s1->top;//返回元素个数
}

 判断栈是否为空

int empty_stack(ST* s1)
{assert(s1);return s1->top == 0;//当存放的元素个数等于0意味着空//为空返回1(真),不为空返回0(假)
}

2.4获取栈顶元素

需要注意的点是,首先栈不能够是空的,其次top是元素的个数,不是当前元素的下标,上一个才是对应元素的下标。举个例子,当栈有一个元素时,top就为1了,而1指的是数组的第二个元素。

STDateType sttop(ST* s1)
{assert(s1);assert(!empty_stack(s1));//栈不能为空,为空则出不了栈return s1->stack[s1->top - 1];
}

2.5出栈

出栈相当简单,直接将存放元素个数的内容-1即可,如此就不可能再次访问到它

void pop_stack(ST* s1)
{assert(s1);assert(!empty_stack(s1));//栈不能为空s1->top--;
}

2.6摧毁栈

这个很简单,没什么好说的,直接将栈结构体的空间释放掉,并将对应的内容归零即可。

void destory_stack(ST* s1)
{assert(s1);s1->capacity = 0;s1->top = 0;free(s1->stack);s1->stack = NULL;
}

2.7测试接口

测试代码:
 

#include"stack.h"
void test1()
{ST s1;init_stack(&s1);push_stack(&s1, 1);push_stack(&s1, 2);push_stack(&s1, 3);push_stack(&s1, 4);push_stack(&s1, 5);printf("%d\n", size_stack(&s1));while (!empty_stack(&s1)){printf("%d ", sttop(&s1));pop_stack(&s1);//边打印栈顶元素边出栈}destory_stack(&s1);//摧毁栈
}
int main()
{test1();
}

测试结果:

三、所有代码

1.接口实现

#include"stack.h"
void init_stack(ST* s1)
{assert(s1);//传过来的是一个指针,不应该是空指针,空指针无法操作,故断言s1->stack = (STDateType*)malloc(sizeof(STDateType)*4);//将栈空间初始化成只可以存放4个元素的空间if (s1->stack == NULL){perror("init_stack");//如果连基本的初始化都完成失败,就没有进行下去的必要了exit(-1);}s1->capacity = 4;//容量初始化成4s1->top = 0;//已经存放的元素个数初始化为0
}
void push_stack(ST* s1, STDateType x)
{assert(s1);if (s1->capacity == s1->top)//空间满了,要扩容{int newcapacity = (s1->capacity) * 2;//扩容至原来的两倍s1->stack=(STDateType*)realloc(s1->stack, sizeof(STDateType)*newcapacity);if (s1->stack == NULL){perror("push_stack");exit(-1);//扩容失败也别玩了}s1->capacity = newcapacity;//扩容成功,容量改变}s1->stack[s1->top] = x;//压栈s1->top++;//压栈成功,存放的元素个数+1
}
void pop_stack(ST* s1)
{assert(s1);assert(!empty_stack(s1));//栈不能为空s1->top--;
}
STDateType sttop(ST* s1)
{assert(s1);assert(!empty_stack(s1));//栈不能为空,为空则出不了栈return s1->stack[s1->top - 1];
}
int size_stack(ST* s1)
{assert(s1);return s1->top;//返回元素个数
}
int empty_stack(ST* s1)
{assert(s1);return s1->top == 0;//当存放的元素个数等于0意味着空//为空返回1(真),不为空返回0(假)
}
void destory_stack(ST* s1)
{assert(s1);s1->capacity = 0;s1->top = 0;free(s1->stack);s1->stack = NULL;
}

2.栈的头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int STDateType;
//到时修改类型时只用改这里的一个就可以,不需要一个个修改
//同样,这也是为了和单一的int作区分
typedef struct stack
{STDateType* stack;//栈空间int top;//已经存放的元素个数int capacity;//容量大小
}ST;//创建栈的结构体,并将它的名字自定义为ST
void init_stack(ST* s1);
void push_stack(ST* s1,STDateType x);
STDateType sttop(ST* s1);
int size_stack(ST*s1);
int empty_stack(ST* s1);
void destory_stack(ST* s1);
void pop_stack(ST* s1);

3.测试代码

#include"stack.h"
void test1()
{ST s1;init_stack(&s1);push_stack(&s1, 1);push_stack(&s1, 2);push_stack(&s1, 3);push_stack(&s1, 4);push_stack(&s1, 5);printf("%d\n", size_stack(&s1));while (!empty_stack(&s1)){printf("%d ", sttop(&s1));pop_stack(&s1);//边打印栈顶元素边出栈}destory_stack(&s1);//摧毁栈
}
int main()
{test1();
}

好了,栈就说完了,再来个三小时,博主爆肝一篇队列的。

感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O

http://www.dinnco.com/news/50652.html

相关文章:

  • 团购网站开发需要多久手机百度安装下载
  • 郑州哪家公司做网站好今天的新闻 最新消息摘抄
  • 在ps做网站分辨率96可以吗如何推广网站链接
  • 吃什么补肾虚效果最好食物上海专业优化排名工具
  • 厦门企业做网站灰色词seo推广
  • wordpress http_user_agent百度seo优化规则
  • 网站空间管理站产品网站推广
  • 广西壮族自治区人口长沙市seo百度关键词
  • wordpress security plugins结构优化是什么意思
  • 广州市信息技术职业学校关键词优化步骤简短
  • 搭建网站需要做什么推广网络公司
  • 仪征做网站公司哪家好sem广告投放是做什么的
  • 做网站的多钱今天国际新闻最新消息10条
  • 英语网站案例长沙seo外包优化
  • 运城网站建设公司网络推广都需要做什么
  • 做饼的网站好看的html网页
  • 网站怎么上传ftp发布推广信息的网站
  • 做网站首页图片素材网络推广的主要内容
  • 网站开发有什么工作内容ip营销的概念
  • 鞍山人才招聘网官网宁波网站关键词优化公司
  • 网站和app区别与联系网站自然优化
  • 怎么做网站页面免费的长春建站程序
  • 万先生网站苏州seo建站
  • 做印刷在哪个网站接单好好关键词搜索广告
  • 深圳建设工程交易服务网站怎么从网上找客户
  • 在自己网站做blogchinaz站长素材
  • 什么网站做私人空间好长沙seo关键词排名优化
  • 东莞网站建设报价 一呼百应注册域名后如何建立网站
  • 网站优化两大核心要素是什么深圳推广网络
  • 网站核验单怎么下载百度关键词快速优化