初始化栈的代码_数据结构中的栈,你知道多少?

由于栈比较简单,也很容易理解,学过的人都知道一句话就可以描述栈的特性:后进先出。所以这篇文章主要是写如何使用代码来描述栈,当然也是让大家很容易理解的语言。还是先给出这篇文章的大致脉络。


首先,对栈有一个基本认识接下来,用代码实现栈,以及栈的常用操作然后,介绍栈的几种应用场景最后,小结一下。

OK,开始。

一、初识栈

栈其实就是一个后进先出的线性表。就好比有很多辆车进了一个死胡同,第一进去的,总是最后一个出来。下面图来演示一下:

b1029e7946ea56563647ffc529d8d669.png

这个图我是用画图工具画的,所以画的不好看,还请见谅,但是基本上都能看懂,第一辆进去的车,总是最后一个出去。

有了这个概念,我们再来看一下栈的分类。栈的分类是根据其存储结构来划分的。有顺序存储结构和链式存储结构。这个两种结构也会有相应的代码实现。

然后就是栈的常用操作:

(1)判断栈是否为空、是否已满

(2)入栈、出栈操作

(3)获取栈顶元素

(4)获取栈的大小

这里面比较重要的就是入栈和出栈操作了。因此下面先用两张图来表示一下,入栈和出栈的操作。首先是入栈

6ca2c407ed8dfa7aa9bf560f65eae9bb.png

然后就是出栈操作

b829702ae4f6c3be3e2c7d3faba95a36.png

OK,到这首先总结一下,在第一部分,提到栈的特点:后进先出。然后讲有两个分类,最后给出了常用方法。下面这一部分就开始使用代码去实现一个栈了。

二、栈的实现

1、顺序栈

顺序栈是根据顺序存储结构来写的,底层是由数组来实现的。因此在这里我们不需要定义节点,在这里用java代码实现顺序栈有两个步骤,

第一:定义栈的接口,接口内部定义了栈的常用操作方法

第二:然后就是接口的实现了。

下面按照这个步骤一步一步来看。

第一步:定义接口

ee185af1bd0e198a5a63cc5140a2c5fe.png

第二步:接口的实现

21e33d8eb98793ae155d5f91a7232642.png
db61c7a765af2fb814ca77924f4262cd.png

从上面的操作可以看到,一共实现了4个方法,其中有两个构造方法和初始化 方法。有一个知识点需要掌握,就是push的时候,先插入再移动。pop的时候,先移动再插入。代码很简单。注释的很清晰。毕竟只有当你有需要的时候,才会去认真看代码。下面看看链式栈

2、链式栈

这个链式栈就需要你定义节点了,因为链式栈的每一个节点要存的信息比较多,比如当前节点的数据值,还有下一个节点的地址,因此实现一个链式栈,也需要两个步骤:

第一:定义节点

第二:根据节点定义栈的接口

第三:实现接口

下面就根据上面的步骤来一步一步实现:

第一步:定义节点

a6e683549806ca98821e210f0f7fdb19.png

第二步:根据节点定义接口:

42502d8973f6794fa797aa1179e2f76e.png

第三步:实现栈接口

cad19aaa9782efa4835820b75662c2ca.png

OK,这个链式栈其实和顺序栈差不多,稍微麻烦一点,不过这些代码看起来也比较简单,比如说我出栈的时候要先判断当前栈是否为空。入栈 的时候要判断栈是否已满。有了对栈的基本操作,我们就可以进入下一阶段的学习,也就是栈的使用场景

三、栈的使用场景

1、表达式计算

比如现在有一个表达式1+(4-6*3)/2=2。然后我们使用栈,看看如何去计算他。

第一步:我们需要将这个表达式表示为后缀表达式1463*-2/+。

第二步:使用栈来计算(图解):碰见数字就入栈,碰见符号先运算。

2c4111f55976022415dde0bc3c774731.png

从上面的例子应该能看懂,只需要掌握一句话:遇见数字就入栈,遇见符号就出栈,然后把结果再入栈。

2、递归

我们都知道有一个著名的函数叫斐波那契数列,它是由另外一个著名的例子引出来的


假如说兔子在出生两个月就有繁殖能力,以后一对兔子每个月能生一对小兔子,假设所有兔子不死,也不考虑近亲结婚这些情况,一年后一共有多少只兔子。

我们可以看出,几个月之后,老兔子可以生小兔子,一开始生的小兔子也可以生小小兔子了,无穷无尽。这个就是一个斐波那契数列。1:1:2:3:5:8:13.。。。。。

当我们使用栈就可以很容易解决这个问题,

2c32d600b2ee565c96eec9cfb7adde68.png

代码就是一个递归函数。我可以给出

f2c87e16e779950de3b691bf0f6a13a8.png

3、括号匹配

这个问题,说实话自己是最熟悉的,因为我考研究生的时候,机试就有这道题,还在考前狠狠的复习了好几遍。括号匹配跟表达式求解的形式差不多,但是稍微有一点出入。举个例子吧

输入一个字符串 里面只含有 [ , ] , ( , ) 四种括号 ; 现要求判断这个字符串 是否满足括号匹配 。如 ([])() 是匹配的 ([)]是不匹配的

给出代码

5263a63cf5895834d256cf9cf444fb46.png

四、总结

由于这里主要讲解数据结构中的栈,所以就不给出java中的栈了,java中的stack我会在集合专题讲解,还请大家支持关注。说到底栈还是比较简单的,包括队列,其特点很容易理解,关键在于应用和平时的面试题。谢谢。

喜欢的给个关注呗,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值