【数据结构基础笔记】【栈】

代码参考《妙趣横生的算法.C语言实现》

文章目录

  • 前言
    • 1、栈的定义
    • 2、创建一个栈
    • 3、入栈和出栈操作
    • 4、栈的清空、销毁、计算栈的当前容量
    • 5、实例分析


前言

本章总结:栈的定义、创建栈,销毁栈,入栈出栈操作等操作。


1、栈的定义

栈是一种重要的线性结构。是链表和顺序表的具体形式。

stack是一个后进先出的线性表。栈的操作只能限定在这个顺序表的表尾进行,我们称这个地方为栈顶(top),相应的表头称为栈底(bottom)
在这里插入图片描述
最开始栈中不含有任何数据,叫做空栈,此时栈顶就是栈底。数据从栈顶进入,栈顶栈底分离,栈的容量变大。数据出栈时从栈顶弹出,栈顶下移,整个栈的当前容量变小。

用顺序表建立栈:

typedef struct {ElemType *base;	//指向栈底的指针ElemType *top;	//指向栈顶的指针int stacksize;	//当前可使用的最大容量
}sqStack;

2、创建一个栈

1、在内存中开辟一段连续的空间,用作栈的物理存储空间;
2、将栈顶、栈底的地址赋值给top和base,并设置stacksize,以便通过这个变量对栈进行各种操作

#define STACK_INIT_SIZE 100
void initStack(sqStack *s)
{//内存中开辟一段连续空间作为栈空间,首地址赋值给s->bases->base = (ElemType*)malloc(sizeof(ElemType) * STACK_INIT_SIZE);if (!s->base){printf("分配内存失败");exit(0);}	//分配内存失败s->top = s->base;		//空栈,栈顶和栈底重合s->stacksize = STACK_INIT_SIZE;		//设定最大容量
}
/*注意:
要区分栈的最大容量和栈的当前容量两个概念。
对于此栈,最大容量为100个ElemType 类型空间大小,但是它是一个空栈,因为它里面没有任何内容
*/

3、入栈和出栈操作

入栈:每向栈中压入一个数据,top指针+1,直到栈满为止

//入栈
#define STACKINCREMENT 10
void PushStack(sqStack* s,ElemType elem)
{if (s->top - s->base >= s->stacksize) //判断栈是否满了{//如果栈满了,追加空间s->base = (ElemType*)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(ElemType));if (!s->base)		//内存分配失败{printf("内存分配失败");exit(0);}s->top = s->base + s->stacksize;s->stacksize = s->stacksize + STACKINCREMENT;		//重置栈的最大容量}*(s->top) = elem;			//放入数据s->top++;					//top指针+1
}

出栈操作就是栈顶(指针先下移指向栈顶元素)取出元素,栈顶指针随之下移的操作。可以重复出栈,直道该栈变为空栈为止

//出栈操作
void PopStack(sqStack* s, ElemType *elem)
{if (s->top == s->base) return;		//栈空了,程序返回s->top--;							//top指针-1*elem = *(s->top);					//将栈顶元素取出,给elem
}

4、栈的清空、销毁、计算栈的当前容量

1、清空一个栈就是希望栈中的元素全部作废,而栈本身的物理空间不一定发生变化。
因此只需要将s->top的内容赋值为s->base即可
2、销毁一个栈是要释放掉该栈所占据的物理内存空间,因此销毁与清空栈是两个不同的操作。

//栈的一些操作:清空一个栈、销毁一个栈、计算栈当前的容量
//清空一个栈
void ClearStack(sqStack* s)
{s->top = s->base;		//将栈底指针赋值给栈顶指针,表示栈已变空
}
//销毁一个栈
void DestroyStack(sqStack* s)
{free(s->base);				//释放掉内存空间s->base = s->top = NULL;	//栈顶栈底指针置NULLs->stacksize = 0;			//栈的最大容量设置为0
}//计算栈当前容量
int GetStackLen(sqStack s)
{return (s.top - s.base);	//这里不对栈中的数据进行修改,所以不需要引用
}

5、实例分析

利用栈的数据结构,将二进制转换为十进制:

已知公式为:
在这里插入图片描述
思路:将一串二进制的0/1码,从高位到低位顺序入栈,再逐一从栈顶取出元素,取出的第i个元素乘上2的i-1次方,并逐一累加,最终得到十进制表达。

#include "stdio.h"
#include "malloc.h"
#include "conio.h"
#include <stdlib.h>
#include <math.h>
typedef char ElemType ;
typedef struct {ElemType *base;	//指向栈底的指针ElemType *top;	//指向栈顶的指针int stacksize;	//当前可使用的最大容量
}sqStack;
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
void initStack(sqStack *s)
{//内存中开辟一段连续空间作为栈空间,首地址赋值给s->bases->base = (ElemType*)malloc(sizeof(ElemType) * STACK_INIT_SIZE);if (!s->base){printf("分配内存失败");exit(0);}	//分配内存失败s->top = s->base;		//空栈,栈顶和栈底重合s->stacksize = STACK_INIT_SIZE;		//设定最大容量
}
/*注意:
要区分栈的最大容量和栈的当前容量两个概念。
对于此栈,最大容量为100个ElemType 类型空间大小,但是它是一个空栈,因为它里面没有任何内容
*///入栈
void PushStack(sqStack* s,ElemType elem)
{if (s->top - s->base >= s->stacksize) //判断栈是否满了{//如果栈满了,追加空间s->base = (ElemType*)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(ElemType));if (!s->base)		//内存分配失败{printf("内存分配失败");exit(0);}s->top = s->base + s->stacksize;s->stacksize = s->stacksize + STACKINCREMENT;		//重置栈的最大容量}*(s->top) = elem;			//放入数据s->top++;					//top指针+1
}//出栈操作
void PopStack(sqStack* s, ElemType *elem)
{if (s->top == s->base) return;		//栈空了,程序返回s->top--;							//top指针-1*elem = *(s->top);					//将栈顶元素取出,给elem
}//栈的一些操作:清空一个栈、销毁一个栈、计算栈当前的容量
//清空一个栈
void ClearStack(sqStack* s)
{s->top = s->base;		//将栈底指针赋值给栈顶指针,表示栈已变空
}
//销毁一个栈
void DestroyStack(sqStack* s)
{free(s->base);				//释放掉内存空间s->base = s->top = NULL;	//栈顶栈底指针置NULLs->stacksize = 0;			//栈的最大容量设置为0
}//计算栈当前容量
int GetStackLen(sqStack s)
{return (s.top - s.base);	//这里不对栈中的数据进行修改,所以不需要引用
}int main()
{ ElemType c;sqStack s;int len = 0, i = 0, sum = 0;printf("请输入一个二进制数\n");initStack(&s);/*输入01字符表示的二进制数,以#结束*/scanf("%c",&c);while (c != '#'){PushStack(&s,c);printf("将%c压入栈中\n",c);scanf("%c", &c);}getchar();len = GetStackLen(s);printf("len:%d\n", len);for(i=0;i<len;i++){PopStack(&s,&c);printf("%c ", c);sum = sum + (c - '0') * pow(2, i);		//转换成十进制}printf("十进制数是:%d\n",sum);DestroyStack(&s);			//释放栈空间_getche();return 0;
}

reslut:
在这里插入图片描述

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

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

相关文章

用HTML语言制作list标记,html5 datalist标签的用法是什么?这里有datalist标签的用法实例...

本篇文章主要为大家讲述了关于html5 datalist标签的用法及html5 datalist标签的用法实例。本文说了两个常用的选项框的实例供大家选择观看&#xff0c;下面就让我们一起来看这篇文章吧我们先来看看html5 datalist标签的用法&#xff1a;标签定义选项列表。请与input元素配合使用…

【数据结构基础笔记】【队列】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、队列定义2、创建一个队列3、入队列4、出队列5、销毁一个队列6、循环队列的概念7、循环队列的实现8、实例分析前言 本章总结&#xff1a;链队列定义&#xff0c;创建&#xff0c;出队入队操作&#xff0c;销毁操作&#x…

html图片自动循环轮播图,js实现图片无缝循环轮播

本文实例为大家分享了js实现图片无缝循环轮播的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下代码如下Document#container{overflow:hidden;width:400px;height:300px;margin:auto;}#front,#container{display:flex;flex-direction:row;}#container img{width:400px…

五、json模块

一、json模块的介绍 json模块是Python自带的模块&#xff0c;用于json和Python数据之间的相互转换 Json与Python数据类型的对应关系 JsonPythonobjectdictarrayliststringstrnumber(int)int,longnumber(real)floattrueTruefalseFalsenullNone [#中括号括起来的&#xff0c;对…

【数据结构基础笔记】【树】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、树的概念2、二叉树3、二叉树的遍历4、创建二叉树5、实例分析前言 本章总结&#xff1a;树的概念、二叉树的创建、遍历 1、树的概念 树结构是以分支关系定义得一种层次结构。 树的定义&#xff1a;树是由n(n>0)个结点…

可以自动撑起的html样式,好好玩:CSS3抖动样式CSS Shake让你的网页酷炫起来

之前在一些网站发现了一个好玩的样式&#xff0c;就是鼠标移到网站LOGO上&#xff0c;logo会自动抖动起来&#xff0c;显得非常炫酷。我也是十分感兴趣。自从本站新添加了一个视觉设计的分类之后&#xff0c;我也是想起来有个抖动CSS样式CSS Shake&#xff0c;所以今天给小伙伴…

爬虫项目(一)---采集最近一日世界各国的疫情数据信息

该内容出自黑马程序员教程 采集最近一日世界各国疫情数据 步骤&#xff1a; 发送请求&#xff0c;获取疫情首页从疫情首页中提取最近一日各国疫情字符串从最近一日各国疫情字符串中提取json格式字符串把json格式字符串转换为Python类型把Python类型的数据&#xff0c;以json…

【数据结构基础应用】【顺序表】

代码参考《妙趣横生的算法.C语言实现》、《剑指OFFER 名企面试官精讲典型编程题 第2版》等 文章目录前言1、合并两个顺序表前言 本章总结在看书过程中的一些关于顺序表的算法题并可能含有一些自己的一些疑问。题目数量不定&#xff0c;随阅历增加而增加&#xff1b; 1、合并两…

html上下滚动切换顶端tab,jQuery实现Tab菜单滚动切换的方法

本文实例讲述了jQuery实现Tab菜单滚动切换的方法。分享给大家供大家参考。具体如下&#xff1a;这是一款jQuery实现让你的Tab菜单滚动的代码,先运行一下看看效果咋样?是不是超不错,让你的网页变得灵动起来,不再静止,学习jquery的朋友也可作为范例来参考吧.运行效果截图如下&am…

[转载]十四步实现拥有强大AI的五子棋游戏

又是本人一份人工智能作业……首先道歉&#xff0c;从Word贴到Livewrter&#xff0c;好多格式没了&#xff0c;也没做代码高亮……大家凑活着看……想做个好的人机对弈的五子棋&#xff0c;可以说需要考虑的问题还是很多的&#xff0c;我们将制作拥有强大AI五子棋的过程分为十四…

爬虫项目(二)---采集从03月02号以来的世界各国疫情数据

该内容出自黑马程序员教程 采集从03月02号以来的世界各国疫情数据 步骤&#xff1a; Ⅰ&#xff0c;重构项目(一)的代码&#xff0c;以提高扩展性 把功能封装到一个类中每一个小功能变成一个方法通过run方法启动爬虫 import requests import re import json from bs4 impor…

【原创】StreamInsight查询系列(二十)——查询模式之检测间隙事件

上篇文章介绍了查询模式中如何检测异常事件&#xff0c;这篇博文将介绍StreamInsight中如何检测间隙事件。 测试数据准备 为了方便测试查询&#xff0c;我们首先准备一个静态的测试数据源&#xff1a;// 创建数据源&#xff0c;要注意的是4:16和4:30之间存在的事件间隙 var sou…

【数据结构基础应用】【查找和排序算法】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、顺序查找2、折半查找3、直接插入排序4、选择排序5、冒泡排序6、希尔排序7、快速排序8、堆排序9、排序算法性能比较10、所有算法的code&#xff08;C语言&#xff09;前言 本章总结查找和排序算法&#xff1a;顺序查找、折…

爬虫项目(三)---采集最近一日全国各省疫情数据

该内容出自黑马程序员教程 采集最近一日全国各省疫情数据 当然&#xff0c;数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url&#xff1a;https://ncov.dxy.cn/ncovh5/view/pneumonia 思路&#xff1a;首先需要先确定全国各省疫情数据的位置 全国各省份的疫情数据…

计算机专业博士后排名,排名丨计算机专业领域TOP10,性价比超高!

原标题&#xff1a;排名丨计算机专业领域TOP10&#xff0c;性价比超高&#xff01;相信各位家长、同学已经看过太多专业的排名&#xff0c;我问过很多理科生将来想学什么专业&#xff0c;听到频率最高的还是计算机专业。似乎大家都知道&#xff0c;学计算机是比较挣钱的&#x…

js 命名规范

转载于:https://www.cnblogs.com/zjx2011/p/3165043.html

爬虫项目(四)---采集从01月22日以来全国各省疫情数据

采集从03月02日以来全国各省疫情数据 当然&#xff0c;数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url&#xff1a;https://ncov.dxy.cn/ncovh5/view/pneumonia 分析 确定01月22日以来全国各省疫情数据的URL 由项目(三)可以获取全国各省疫情数据点击可下载&…

纠错码trick和数据压缩trick

纠错码和压缩算法是同一枚硬币的两面。 两者都来自于对冗余的想法。 纠错码被视为向消息或文件中添加冗余的原则性方法。而压缩算法正好相反&#xff0c;他们会从消息或文件中移除冗余。 压缩和纠错并不是彼此抵消的&#xff0c;相反&#xff0c;好的压缩算法会移除抵消冗余&am…

常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

博主联系方式&#xff1a; QQ:1540984562 QQ交流群&#xff1a;892023501 群里会有往届的smarters和电赛选手&#xff0c;群里也会不时分享一些有用的资料&#xff0c;有问题可以在群里多问问。 目录1、穷举法2、贪心算法3、递归与分治算法4、回溯算法5、数值概率算法1、穷举法…

工程师英语和计算机证书查询,点击进入国家硬件维修工程师证书查询网站

工程师证书查询网站人力资源社会保障部指定查询国家职业资格证书的唯一官方网站。涵盖全国各省市、各行业、各央企颁发的证书。电脑硬件维修工程师网上能查看国家工信部硬件维修工程师证书查询网址&#xff1a;http://www.ceiaec.org/index.htm工程师证书编号在网上怎么查询如果…