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

代码参考《妙趣横生的算法.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,一经查实,立即删除!

相关文章

四、正则表达式

一、正则表达式的概念和作用 正则表达式概念&#xff1a;一种字符串匹配的模式 正则表达式作用&#xff1a; 可以检查一个字符串中是否包含某种字串替换匹配的字串提取某个字符串中匹配的字串 二、正则表达式中常见的语法 字符描述原样字符匹配字符一般字符匹配自身beyondb…

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

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

java treemap_Java TreeMap lastKey()方法与示例

java treemapTreeMap类lastKey()方法 (TreeMap Class lastKey() method) lastKey() method is available in java.util package. lastKey()方法在java.util包中可用。 lastKey() method is used to return the last highest key element value exists in this TreeMap. lastKey…

网上看来的

http://blog.163.com/dong_xiao_yang/blog/static/216138205201321114659430/ http://ffmpeg.org/trac/ffmpeg/wiki/How%20to%20compile%20FFmpeg%20for%20Raspberry%20Pi%20%28Raspbian%29#FFmpegwithlibaacpluslibx264andalsa-lib 编译环境 Ubuntu 12.04 w64-mingw32下载lib…

阅读iPhone.3D.Programming(O'Reilly.2010-05) 英文版 第一感觉

最近开始阅读iPhone.3D.Programming(OReilly.2010-05)&#xff0c;英文版此书&#xff0c;我阅读到P21了&#xff0c;中间讲了一个样例&#xff0c;HelloArrow在这个过程中&#xff0c;我想简单点&#xff0c;少打点字&#xff0c;直接拿书中配套来学习&#xff0c;发现一个问题…

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

代码参考《妙趣横生的算法.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;对…

Android开发和调试必备工具-SDK Tools

原文链接&#xff1a;http://android.eoe.cn/topic/android_sdk SDK Tools是Android SDK的一个可下载部分&#xff0c;它包括Android SDK的开发和调试的所有工具。 如果你刚刚了解SDK&#xff0c;你可以从SDK starter package下载最新版本的SDK。 如果你已经在使用SDK&#xff…

strictmath_Java StrictMath ceil()方法与示例

strictmathStrictMath类ceil()方法 (StrictMath Class ceil() method) ceil() method is available in java.lang package. ceil()方法在java.lang包中可用。 ceil() method is used to return the least or smallest value of the double type value which is greater than or…

web应用之文件上传

一、Jakart:Jakart文件上传&#xff1a;&#xff08;推荐使用&#xff09; import java.io.File;import java.io.IOException;import java.util.List; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletReq…

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

代码参考《妙趣横生的算法.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;所以今天给小伙伴…

linux技巧----查找某个正在执行的脚本

如果在机器上发现有执行的脚本&#xff0c;却不知道在哪&#xff0c;可以这样找 例如 # netstat -ltnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp …

成功沟通的六要素

沟通在我们的生活、工作中必不可少&#xff0c;成功的沟通有助于事业成功&#xff0c;家庭美满&#xff01;下面分享一篇关于沟通的文章&#xff0c;成功沟通六要素&#xff1a; 当蜘蛛网连接起来&#xff0c;可以捆住一头狮子。——埃塞俄比亚谚语 与他人合作使我们可以实现比…

java中intvalue_Java Number intValue()方法与示例

java中intvalueNumber类intValue()方法 (Number Class intValue() method) intValue() method is available in java.lang package. intValue()方法在java.lang包中可用。 intValue() method is used to return the value denoted by this Number object converted to type int…

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

该内容出自黑马程序员教程 采集最近一日世界各国疫情数据 步骤&#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五子棋的过程分为十四…