数据结构--栈和队列3.1(栈-顺序结构)

目录

栈(Stack)栈顶(top)栈底(bottom)空栈(不含任何元素)

创建栈 

入栈操作

出栈操作

销毁一个栈

计算栈的当前容量

实例分析


栈的插入操作叫做进栈(Push),或者称为压栈、入栈。

栈的删除操作叫做出栈(Pop),或者称为弹栈。

栈又称为先进后出(last in first out)的后进先出原则,称为后进先出的线性表(LIFO)。 

栈的本质上也是一个线性表,线性表有两种存储形式,那么栈也有分为栈的顺序存储结构和栈的链式存储结构

最开始栈中不含有任何数据,叫做空栈,此时栈定就是栈底。然后数据从栈顶进入,栈顶栈底分离,整个栈的当前容量变大。数据出栈时,从栈顶移出,栈顶下一,整个栈的当前容量变小。

栈的顺序存储结构:

typedef struct 
{ElemType *base;ElemType *top;int stacksize;}sqStack;

 这里定义了一个顺序存储的栈,它包含了三个元素:base,top,stacksize。其中base是指向栈底的指针变量,top是指向栈顶的指针变量,stacksize指示栈的当前可使用的最大容量。

创建栈 

#define STACK_INIT_SIZE 100 initStack(sqStack *s)//创建栈 
{s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if(!s->base)exit(0);s->top=s->base;		//最开始,栈顶就是栈底。 s->stacksize = STACK_INIT_SIZE;} 

入栈操作

#include <stdlib.h>
#define STACKINCREMENT 10Push(sqStack *s,ElemType e)		//入栈操作 
{if(s->top - s->base >= s->stacksize){//如果漫展,追加空间 s->base = (ElemType *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType));if(!s->base)exit(0);s->top=s->base + s->stacksize;s->stacksize = s->stacksize + STACKINCREMENT;}*(s-top)=e;s->top++; } 

出栈操作

出栈操作就是在栈顶取出数据,栈顶指针随之下移的操作。

每当从栈内弹出一个数据,栈的当前容量就-1.

Pop(sqStack *s,ElemType *e)
{if(s->top==s->base)//栈已空return;*e=*--(s->top); 
}

销毁一个栈

DestrogStack(sqStack *s)
{int i,len;len = s->stackSize;for(i=0;i<len;i++){free(s->base);s->base++;}s->base = s->top =NULL;s->stacksize = 0;
}

计算栈的当前容量

计算栈的当前容量也就是计算栈中元素的个数,因此只要返回s.top-s.base 即可。

栈的最大容量是指该栈占据内存空间的大小,其值是s.stackSzie,它与栈的当前容量不是一个概念。

int StackLen(sqStack s)
{return (s.top-s.base+1);
}

实例分析

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

#include <stdio.h>
#include <stdlib.h>
#include <math.h>#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10typedef char ElemType;
typedef struct
{ElemType *base;ElemType *top;int stackSize; }sqStack;void InitStack(sqStack *s)
{s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if(!s->base)exit(0);s->top = s->base;s->stackSize=STACK_INIT_SIZE;
}void Push(sqStack *s,ElemType e)
{if(s->top - s->base>= s->stackSize){s->base=(ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT) * sizeof(ElemType));if(!s->base){exit(0);}}*(s->top)=e;s->top++;} void Pop(sqStack *s,ElemType *e)
{if(s->top==s->base){return;}*e = *--(s->top);
}int StackLen(sqStack s)
{return (s.top- s.base);
}int main(void)
{ElemType c;sqStack s;int len ,i,sum=0;InitStack(&s);printf("请输入二进制数,输入#符号表示结束!");scanf("%c",&c);while(c!='#'){Push(&s,c);scanf("%c",&c);}getchar();len = StackLen(s);printf("栈的当前容量是:%d\n",len);for(i=0;i<len;i++){Pop(&s,&c);sum=sum+(c-48)*pow(2,i);}printf("%d",sum);return 0;
}

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

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

相关文章

基于Mybatis Plus的SQL输出拦截器。完美的输出打印 SQL 及执行时长、statement

我们需要想办法打印出完成的SQL&#xff0c;Mybatis为我们提供了 org.apache.ibatis.plugin.Interceptor接口&#xff0c;我们来实现该接口做一些打印SQL的工作 package org.springjmis.core.mp.plugins;import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; impor…

创新零售,京东重新答题?

继新一轮组织架构调整后&#xff0c;京东从低价到下沉动作不断。 新成立的创新零售部在京东老将闫小兵的带领下悄然完成了整合。近日&#xff0c;京喜拼拼已改名为京东拼拼&#xff0c;与七鲜、前置仓等业务共同承载起京东线上线下加速融合的梦想。 同时&#xff0c;拼拼的更…

【从零学习python 】19. 循环遍历列表和列表嵌套的应用

文章目录 列表的循环遍历1. 使用while循环2. 使用for循环3. 交换2个变量的值1. 列表嵌套2. 应用 进阶案例 列表的循环遍历 1. 使用while循环 为了更有效率的输出列表的每个数据&#xff0c;可以使用循环来完成 namesList [xiaoWang,xiaoZhang,xiaoHua] length len(namesLi…

零售行业供应链管理核心KPI指标(一) – 能力、速度、效率和成本

有关零售行业供应链管理KPI指标的综合性分享&#xff0c;涉及到供应链能力、速度、效率和成本总共九大指标&#xff0c;是一个大框架&#xff0c;比较核心也比较综合。 衡量消费品零售企业供应链管理效率和水平的核心KPI通常有哪些&#xff1f; 图片来源-派可数据&#xff08;…

C++ unique_ptr概述 常用操作

文章目录 unique_ptr概述unique_ptr常用操作 unique_ptr概述 uniue_ptr是一个独占式的指针,同一个时刻, 就只能有一个unique_ptr指向这个对象(内存),unique_ptr的使用格式 unique_ptr<Class_Tyep> P_Name; unique_ptr的常规初始化: unique_ptr<int> p; 创建一个空…

监控Kafka的关键指标

Kafka 架构 上面绿色部分 PRODUCER&#xff08;生产者&#xff09;和下面紫色部分 CONSUMER&#xff08;消费者&#xff09;是业务程序&#xff0c;通常由研发人员埋点解决监控问题&#xff0c;如果是 Java 客户端也会暴露 JMX 指标。组件运维监控层面着重关注蓝色部分的 BROKE…

Vue 实现重定向、404和路由钩子(六)

一、重定向 1.1 修改 Main.vue <template><div><el-container><el-aside width"200px"><el-menu :default-openeds"[1]"><el-submenu index"1"><template slot"title"><i class"…

MongoDB常用命令

什么是MongoDB ? MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个…

【网络基础实战之路】基于BGP协议中的联邦号连接三个AS区域的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 【网络基础实战之路】基于…

Dalsa线阵相机说明(Linea Color GigESeries 2k and 4K)

文章目录 一. Dalsa相机软件整体架构二. 相机编号说明以及软件要求三. 相机硬件参数三. 相机基本参数四. 软件参数设置列表1. Sensor Control Category2. I/O Control Category3. Counter and Timer Control Category4. Advanced Processing Control Category(1) 平场校正介绍(…

学习Vue:插值表达式和指令

在 Vue.js 中&#xff0c;Vue 实例与数据绑定是构建动态交互界面的关键。在这篇文章中&#xff0c;我们将重点介绍 Vue 实例中两种实现数据绑定的方式&#xff1a;插值表达式和指令。这些机制允许您将数据无缝地渲染到界面上&#xff0c;实现实时的数据更新和展示。 插值表达式…

U盘提示格式化怎么修复?学会这几个方法!

“不知道大家有没有遇到过将u盘插入电脑后提示格式化的情况呀&#xff1f;第一次遇到这种情况真的好无助&#xff0c;这是可以修复的吗&#xff1f;请大家帮帮我&#xff01;” U盘作为一个便捷的存储工具&#xff0c;帮助我们存储了很多重要的数据和文件。但在使用的过程中&am…

Dockerfile 使用技巧篇

默认的 docker 镜像使用 Linux 来当作基础镜像 01. 使用 alpine 镜像&#xff0c;而不是默认的 linux 镜像 PS: alpine 译为高山植物&#xff0c;就是很少的资源就能存活的意思。alpine 裁剪了很多不必要的 linux 功能&#xff0c;使得镜像体积大幅减小了。 比如 FROM node:1…

PHP8定义字符串的方法-PHP8知识详解

字符串&#xff0c;顾名思义&#xff0c;就是将一堆字符串联在一起。字符串简单的定义方法是使用英文单引号&#xff08; &#xff09;或英文双引号&#xff08;" "&#xff09;包含字符。另外&#xff0c;还可以使用定界符定义字符串。本文还介绍了字符串的连接符。…

TCP的三次握手和四次挥手

文章目录 三次握手四次挥手TIME_WAITCLOSE_WAIT 使用wireshark观察 三次握手 握手的最终目的是主机之间建立连接 首先要有两个预备知识点 三次握手建立连接不一定会成功&#xff0c;其中最担心的就是最后一次握手失败&#xff0c;不过会有配套的解决方案建立好连接后是需要被…

【重温老古董——Strust2框架】基于Idea使用maven创建Strust2项目

1、新建项目 红色圈出的部分是【强制】,其他部分看个人喜好。 2、修改 pom 文件,管理依赖 <dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>2.5.22</version></dependency&g…

微服务中RestTemplate访问其他服务返回值转换问题

背景&#xff1a; 接收一个springcloud项目&#xff0c;UI模块访问其他服务的接口&#xff0c;返回数据统一都是使用fastjson进行转换&#xff0c;但是新开发了几个新模块之后发现fastjson很多bug&#xff08;各种内存溢出&#xff09;&#xff0c;但是很多地方已经重度依赖fa…

数据结构:力扣OJ题(每日一练)

目录 题一&#xff1a;环形链表 思路一&#xff1a; 题二&#xff1a;复制带随机指针的链表 思路一&#xff1a; 本人实力有限可能对一些地方解释的不够清晰&#xff0c;可以自己尝试读代码&#xff0c;望海涵&#xff01; 题一&#xff1a;环形链表 给定一个链表的头节点…

IDEA如何调试Stream API

Stream API现在在实际开发中应用非常广泛&#xff0c;经常会遇到需要调试Stream API的场景&#xff0c;这篇文章主要讲解如何使用IDEA调试Stream Testpublic void test(){Stream.of(10, 20, 30, 40, 50).mapToInt(e->e*10).filter(e->e>200).forEach(System.out::pri…

使用css实现时间线布局(TimeLine)

前言 在使用uni-app开发微信小程序过程中&#xff0c;遇到了时间轴布局&#xff0c;由于每项的内容高度不一致&#xff0c;使用uniapp自带的扩展组件uni-steps&#xff0c;样式布局无法对齐竖线&#xff0c;于是自己造轮子&#xff0c;完成特殊的布局。显示效果如下&#xff1…