算法通过村第四关-栈青铜笔记|手写栈操作

文章目录

  • 前言
  • 1. 栈的基础概要
    • 1.1 栈的特征
    • 1.2 栈的操作
    • 1.3 Java中的栈
  • 2. 栈的实现(手写栈)
    • 2.1 基于数组实现
    • 2.2 基于链表实现
    • 2.3 基于LinkedList实现
  • 总结


前言


提示:我自己一个人的感觉很好 我并不想要拥有你 除非你比我的独处更加宜人 --瓦尔桑·希雷

1. 栈的基础概要

1.1 栈的特征

栈和队列是比较特殊的线性表,为什么特殊呢?(又称为访问受限的线性表)。栈常用于表达式、符号等运算的基础,也是递归的底层实现。理论上递归可以做的题目栈都是可以做的,只是有些问题用栈相对复杂一些。

栈的底层实现是我们常见的链表或者顺序表,栈与线性表的最大区别在于数据的存取操作被限制了,其插入和删除操作只允许在线性表的一端进行。一般而言,我们把允许操作的一端称为栈顶(top),不可以操作的一端称为栈底(bottom),同时插入元素的操作称为入栈(push)删除元素的操作称为出栈(pop)。若栈中没有任何元素,则称为空栈,栈的结构如图所示:
在这里插入图片描述

1.2 栈的操作

栈的常见操作主要有:

  • push(E):增加一个元素E
  • pop():弹出元素E
  • peek():显示栈顶元素,但是不出栈
  • empty():判断栈是否为空

我们在设计自己的栈的时候,不管是使用数组还是链表,都需要实现以上的几个方法。

一道经典的题目,入栈顺序为1234,所有可能的出栈序列是什么?

这个题是什么意思呢?举个例子,我们可以先让1,2入栈,然后2,1出栈,再让3,4入栈,然后一次出栈,就可以得到2143的序列。

4个元素的全排列有4!= 24,栈要求符合先进后出,根据这个条件我们可以排除:

1234 √ 1243 √ 1324 √ 1342 √ 1423 × 1432 √

2134 √ 2143 √ 2314 √ 2341 √ 2413 × 2431 √

3124 × 3142 × 3214 √ 3241 √ 3412 × 3421 √

4123 × 4132 × 4213 × 4231 × 4312× 4321 √

14中可能,10中不可能。

1.3 Java中的栈

Java中的栈,uitl中就提供了栈Stack类,使用起来也不复杂,我们看一下例子:


import java.util.Stack;public class MainTest {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();// 入栈stack.push(1);stack.push(2);stack.push(3);stack.push(4);// 出栈stack.pop();while (!stack.isEmpty()) {// 展示但是不删除System.out.println(stack.peek());// 删除System.out.println(stack.pop());}}
}

2. 栈的实现(手写栈)

我们在学习栈的过程中,需要了解一些问题,top栈顶指针的指向,有的地方指向栈顶再往上一个空位,有的地方指向栈顶元素。我们确定好设计就行,(根据题目调整,有时候也可以直接问面试官 top指向哪里)这里采用指向栈顶空位置。

如果我们自己要实现栈,可以使用数组,链表Java中提供了LinkedList三种基本实现方式,我们都可以看一下。

2.1 基于数组实现

采用顺序表实现的栈,内部以数组为基础,实现对元素的存取操作。在应用中还要之一每次入栈之前要确保栈的容量是否足够,不够需要考虑扩容的问题。

我们画一下入栈的过程:
在这里插入图片描述
出栈的过程:
在这里插入图片描述
出栈先将栈顶元素取出,然后top–

展示代码:

import java.util.Arrays;class Mystack<T> {private Object[] stack;// 栈顶指针private int top;public Mystack() {// 初始长度为10stack = new Object[10];}/*** 判断是否为空** @return*/public boolean isEmpty() {return top == 0;}/*** 返回栈顶元素但是不删除** @return*/public T peek() {T t = null;if (top > 0) {t = (T) stack[top - 1];}return t;}/*** 入栈操作** @param t*/public void push(T t) {expandCapacity(top + 1);stack[top] = t;top++;}public T pop() {T t = peek();if (!isEmpty()) {// 清除元素stack[top - 1] = null;top--;}return t;}/*** 确保容量** @param size*/public void expandCapacity(int size) {int len = stack.length;if (size > len) {size = size * 3 / 2 + 1;stack = Arrays.copyOf(stack, size);}}
​
​
​
​public static void main(String[] args) {Mystack<String> stack = new Mystack<>();System.out.println(stack.peek());// nullSystem.out.println(stack.isEmpty());// truestack.push("java");stack.push("is");stack.push("beautiful");stack.push("language");System.out.println(stack.pop());// languageSystem.out.println(stack.isEmpty());// falseSystem.out.println(stack.peek()); // beautiful}
}

2.2 基于链表实现

链表用来实现栈也很简单,头插法(在头部操作链表就可以了)。
我们先画个图:

在这里插入图片描述
在链表的那一章我们介绍过没有虚拟节点时对链表头部元素进行插入和删除的操作,不记得的可以回顾一下算法通过村第二关-链表青铜笔记_师晓峰的博客-CSDN博客,这里基于链表实现栈的操作时完全一样的。

代码实现:

class ListStack<T> {// 构造节点class Node<T> {public T t;private Node next;}public Node<T> head;ListStack() {head = null;}/*** 入栈操作* @param t*/public void push(T t) {if (t == null) {throw new IllegalStateException("参数不能为空");}// 头节点为空if (head == null) {head = new Node<T>();head.t = t;head.next = null;}else {Node<T> temp = head;head = new Node<T>();head.t = t;head.next = temp;}}/*** 出栈操作* @return*/public T pop(){if (head == null) {return null;}T t = head.t;head = head.next;return t;}public T peek(){if (head == null) {return null;}return head.t;}/*** 判断是否为空** @return*/public boolean isEmpty() {return head == null;}public static void main(String[] args) {ListStack stack = new ListStack();System.out.println(stack.isEmpty());// truestack.push("Java");stack.push("is");stack.push("beautiful");System.out.println(stack.peek());// beautifulSystem.out.println(stack.pop());// beautifulSystem.out.println(stack.isEmpty());// false}
}

2.3 基于LinkedList实现

这里就很简单了,直接上代码就行;

import java.util.LinkedList;/*** 基于Java的LinkedList来实现栈* @param <T>*/
public class LinkedListStack<T> {private LinkedList<T> ll;LinkedListStack(){ll = new LinkedList<T>();}/*** 入栈操作* @param t*/public void push( T t){ll.addFirst(t);}/*** 出栈但是不删除* @return*/public T peek(){T t = null;if (!ll.isEmpty()){t = ll.peek();}return t;}public T  pop(){return ll.removeFirst();}public boolean isEmpty(){return ll.isEmpty();}public static void main(String[] args) {LinkedListStack<String> stack = new LinkedListStack();System.out.println(stack.isEmpty());//trueSystem.out.println(stack.peek());//nullstack.push("java");stack.push("is");stack.push("beautiful");System.out.println(stack.peek());//beautifulSystem.out.println(stack.pop());//beautifulSystem.out.println(stack.isEmpty());//false}
}

总结

提示:记住栈的特性,先进后出

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

安利超实用的(cc协议)游戏3d模型素材网站

前方干货满满&#xff0c;建议先收藏再看哦&#xff01;为大家整理&#xff08;cc协议&#xff09;游戏3d模型素材&#xff0c;总有满足你需求的一款&#xff0c;除此之外&#xff0c;免费&#xff0c;资源质量好&#xff0c;一键打包下载&#xff0c;你还不心动吗&#xff1f;…

基于VHDL语言的汽车测速系统设计_kaic

摘 要 汽车是现代交通工具。车速是一项至关重要的指标。既影响着汽车运输的生产率,又关乎着汽车行驶有没有超速违章&#xff0c;还影响着汽车行驶时人们的人身安全。而伴随着我国国民的安全防范意识的逐步增强&#xff0c;人们也开始越来越关心因为汽车的超速而带来的极其严重…

在Adobe illustrator中创建线呼吸描记器

Spirographs look complex, but most of them aren’t that hard to create. As promised, here is a follow-up tutorial on how to create a spirograph, only this time it’s a different kind of spirograph than the one we’ve created before. We’ll create a line sp…

当前最强的免费AI画图、AI绘图工具-2

Midjourney比较贵&#xff0c;而且无法访问&#xff0c;Stable Diffusion部署起来很麻烦。网上有哪些可以直接在网页端或者下载的app可以实现AI画图的工具。我们整理了45个相关工具&#xff0c;这是系列2&#xff0c;收录到 当前最强的免费AI画图、AI绘图工具-2https://www.web…

AI绘画扩展安装

想问一下各位大佬&#xff0c;有没有懂这个的&#xff0c;能不能帮我解决一下这个是啥问题&#xff0c;一直安装不了&#xff0c;拜托了&#xff0c;万分感谢

AI-绘图

人工智能肯定是未来的趋势&#xff0c;随着AI的不断发展&#xff0c;ai遍及的方面肯定越来越多。今天我想推荐的是一款免费的关于绘图的AI产品——KOAYEE元宇宙。它只需根据自己提供关键词就能够生成4张不同角度风格的图片&#xff0c;并且可以自己上传图片&#xff0c;融合关键…

Adobe Illustrator 2023 for mac安装教程,可用。

Adobe Illustrator 是行业标准的矢量图形应用程序&#xff0c;可以为印刷、网络、视频和移动设备创建logos、图标、绘图、排版和插图。数以百万计的设计师和艺术家使用Illustrator CC创作&#xff0c;从网页图标和产品包装到书籍插图和广告牌。此版本是2023版本&#xff0c;适配…

adobe illustrator的描边如何选择 HSB 空间

坑 1、 2、 这个空间 如何修改成&#xff1f; H 的色调空间&#xff1f; adobe illustrator 颜色修改为色调空间 坑&#xff1b; 好像不行&#xff0c;

李沐pytorch学习-BatchNormalization

一、意义 在使用较深的网络时&#xff0c;BatchNormalization&#xff08;批量归一化&#xff09;几乎是必需的&#xff0c;可以加速收敛。 对于图1所示的全连接层神经网络&#xff0c;输出节点的GroundTruth为&#xff0c;损失函数为&#xff0c;则损失对权重的梯度为&#xf…

Linux服务——nginx的配置及模块

目录 一、nignx配置 1、nginx的配置文件 2、使用server语句块构建虚拟主机 3、alias别名 4、location语句 二、nginx模块 access模块 验证模块 自定义错误页面 日志存放位置 检测文件是否存在 长连接设置 ngx_http_autoindex_module 模块 三、nginx的高级配置 1、…

大一新生计算机专业要选课,大一新生抢不到选修课怎么办 大学抢课技巧

选修课对于大部分人来说是一个新鲜的名词&#xff0c;科目都是学生自己挑选&#xff0c;不强求&#xff0c;但是有时会有抢不到课的情况&#xff0c;下面是小编整理的详细内容&#xff0c;一起来看看吧&#xff01; 大一新生抢不到选修课怎么办 大一新生抢不到选修课也不要心慌…

计算机人工智能专业大一新生入学前做点什么[及给家长的话]

目前很多同学陆续收到了录取通知书&#xff0c;已经激动地期盼大学生活&#xff0c;我之前写过一些文字&#xff0c;这次我增加了“写给家长的话”&#xff0c;再次发出。 写给家长的话 家长需要意识到&#xff0c;进入大学后孩子将面临一系列困难。越是好大学&#xff0c;入学…

大一新生计算机类专业入门

Java资深小白&#xff0c;不足之处&#xff0c;或者有任何错误欢迎指出。 --蓝紫程序员是出了名的高薪职业&#xff0c;而近几年的人工智能、大数据更是卷起又一波IT热。今年&#xff0c;身边的小年轻们高考志愿大都倾向了计算机类专业&#xff0c;老学姐在这里告诉你们&#x…

福利之舞:员工的心跳与企业的平衡术

引言&#xff1a;员工福利与满意度的关系 在现代企业中&#xff0c;员工福利已经不仅仅是一种待遇&#xff0c;而是与员工满意度、忠诚度和生产力紧密相连的关键因素。一个合理且吸引人的福利制度可以大大提高员工的工作积极性&#xff0c;同时也能够吸引和留住顶尖的人才。但…

大一新生应该如何选购电脑上

大一新生都在陆陆续续买笔记本电脑&#xff0c;但是有很多新手不知道该如何选购&#xff0c;我将从两篇文章讲述&#xff0c;如何选购笔记本电脑。 一、电脑分类 目前市面上的笔记本主要分为三类&#xff1a;轻薄本、游戏本、全能本。 轻薄本&#xff1a;顾名思义就是轻薄&a…

大一新生未来规划

现状&#xff1a;我是一名双非本科的大一新生&#xff0c;从高二下学期开始接触c语言&#xff0c;目前把c语言的基本语法了解的差不多了&#xff0c;但代码能力弱&#xff0c;写个链表比较慢&#xff0c;靠自己写过一个用数组和打印字符实现的贪吃蛇。学过一些基础的算法。也就…

大一计算机课程学什么,大一新生应该如何学习 主要学什么课程

还有不到一个月的时间大学就开学了&#xff0c;对准大一新生们早已迫不及待的想要感受大学生活了&#xff0c;尽管大学没有高中的紧张和压迫感&#xff0c;但是为了毕业有更好的前途&#xff0c;也是需要好好学习的&#xff0c;下面是小编分享的如何在大学里学习&#xff0c;希…

计算机大一新生的体验

hello&#xff0c;young man&#xff01; # 前言&#xff1a;计算机大一新生体验。包含大学的感受以及计算机专业的经历 大学个人建议&#xff1a; 首先&#xff0c;门很重要&#xff0c;是的每个大学有很多门&#xff0c;甚至有些在地图上也不会标出来&#xff0c;也就是所为…

一名大一新生的年终总结

前言 随着高考最后一科结束的铃声响起&#xff0c;我三年的高中生活也落下了帷幕&#xff0c;走出考场看着身边的人有说有笑&#xff0c;自己也感觉轻松了许多&#xff0c;虽然考的好像不是很理想&#xff0c;多少有些失误&#xff0c;但这都不重要了&#xff0c;我已经毕业了…

关于一个学习计算机专业,迷茫的大一新生的看法和理解

一、高考志愿选择时的想法&#xff1a; 在2022年&#xff0c;我在经历了丰富精彩的高三生活后&#xff0c;我终于在高考成绩公布的那晚&#xff0c;整个人都如释重负了&#xff0c;高中三年的努力让我上了一个不错的本科&#xff0c;但也怪自己不是那种拼命努力学习的人&#x…