小白学习java理解栈手写栈——第四关(青铜挑战)

内容1.理解栈的基本特征
2.理解如何使用数组来构造栈
3.理解如何使用链表来构造栈

 1.栈的基础知识

1.1栈的特征

栈和队列是比较特殊的线性表,又称为访问受限的线性表。栈是很多表达式、符号等运算的基础,也是递归的底层实现,理论上递归能做的题目栈都可以,就是有些问题用栈回非常复杂

栈底层实现仍然是链表或者顺序表,栈于线性表的最大区别就是数据的存取的操作被限制了,其插入删除操作只允许在线性表的一段进行,一般而言,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入元素的操作称为入栈(Push),删除元素的操作称为出栈(Pop)。若栈中没有任何元素,则称为空栈,栈的结构如下图:

1.2栈的操作

栈的常用操作主要有:

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

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

1.3Java中的栈

 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);System.out.println("栈顶元素为:" + stack.peek());while (!stack.empty()) {//只显示没出栈System.out.println(stack.peek());//出栈并且显示System.out.println(stack.pop());}}
}

2.基于数组实现栈

在看具体内容之前 ,先补充一个知识点,top有的地方指向栈顶元素,有的地方指向栈顶再往上的一个空单位,这个根据题目要求设计就好,本文采用指向栈顶空位置。

如果要我们自己实现栈,可以有链表、数组和java提供的LinkedList三种基本方式,我们都来写一下吧。

采用顺序表实现的栈吗,内部以数组为基础,实现对元素的存取操作。在应用中还需要注意每次入栈之前先判断栈的容量是否够用,如果不够用,可以进行扩容。

入栈过程如下: 

出栈的过程如图所示:

 

top先将栈顶元素取出来,然后再执行top--。

完整的实现代码是:

import java.util.Arrays;
class Mystack<T> {//实现栈的数组private Object[] stack;//栈顶元素private int top;Mystack() {//初始容量为10stack = new Object[10];}//判断是否为空public boolean isEmpty() {return top == 0;}//返回栈顶元素public T peek() {T t = null;if (top > 0)t = (T) stack[top - 1];return t;}public void push(T t) {expandCapacity(top + 1);stack[top] = t;top++;}//出栈public T pop() {T t = peek();if (top > 0) {stack[top - 1] = null;top--;}return t;}//扩大容量public void expandCapacity(int size) {int len = stack.length;if (size > len) {size = size * 3 / 2 + 1;//每次扩大50%stack = Arrays.copyOf(stack, size);}}public static void main(String[] args) {Mystack<String> stack = new Mystack<>();System.out.println(stack.peek());System.out.println(stack.isEmpty());stack.push("java");stack.push("is");stack.push("beautiful");stack.push("language");System.out.println(stack.pop());System.out.println(stack.isEmpty());System.out.println(stack.peek());}
}

 3.基于链表实现栈

链表也可以实现栈,插入和删除都在头结点进行就可以了。

在链表一章,我们介绍过没有虚拟结点时对链表头元素进行插入和删除的操作方法,而与这里基于链表实现栈是完全一致的。

package com.yugutou.charpter4_stack.level1;class ListStack<T> {//定义链表class Node<T> {public T t;public Node next;}public Node<T> head;//构造函数初始化头指针ListStack() {head = null;}//入栈public void push(T t) {if (t == null) {throw new NullPointerException("参数不能为空");}if (head == null) {head = new Node<T>();head.t = t;head.next = null;} else {Node<T> temp = head;head = new Node<>();head.t = t;head.next = temp;}}//出栈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;}T t = head.t;return t;}//栈空public boolean isEmpty() {if (head == null)return true;elsereturn false;}public static void main(String[] args) {ListStack stack = new ListStack();System.out.println(stack.isEmpty());stack.push("Java");stack.push("is");stack.push("beautiful");System.out.println(stack.peek());System.out.println(stack.pop());System.out.println(stack.isEmpty());}
}

 

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

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

相关文章

linux学习之详解文件

目录 1.先认识文件 2.c语言中常用文件接口 fopen&#xff08;打开文件&#xff09; 3.系统接口操作文件 open write 文件的返回值以及打开文件的本质 理解struct_file内核对象 了解文件描述符&#xff08;fd&#xff09;分配规则 重定向 dup接口 标准错误流 文件缓冲…

数据库:JDBC编程

基本概念 JDBC编程就是通过Java代码来操作数据库 api 数据库是一个类别&#xff1a;MySQL&#xff0c;Oracle&#xff0c;sql server&#xff0c;sqlite 代码操作数据库的前提&#xff1a;数据库提供api&#xff0c;我们要调用api才能完成操作 &#xff08;api&#xff1a…

C++刷题 -- 链表

C刷题 – 链表 文章目录 C刷题 -- 链表1.删除链表的倒数第 N 个结点2.链表相交3.环形链表 1.删除链表的倒数第 N 个结点 https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 快慢指针的应用 fast指针先移动N步&#xff0c;slow依然指向head&#xff1b;然后fa…

Halcon threshold_sub_pix (Operator)

read_image(Image,fabrik) threshold_sub_pix(Image,Border,35) dev_display(Border)Image是输入的原始图像&#xff0c;Threshold是设定的阈值&#xff0c;Width和Height是像素值计算区域的大小&#xff0c;ThresholdedRegion是经过分割后得到的二值化结果。 在对图像进行二值…

Docker-compose容器编排与容器监控

一、Docker-compose 1、概念&#xff1a; Docker-Compose 是 Docker 官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 2、作用&#xff1a; Docker-Compose可以管理多个Docker容器组成一个应用。需要定义一个yaml格式的配置文件 docker-compose.yml&#…

PostGIS学习教程十一:投影数据

PostGIS学习教程十一&#xff1a;投影数据 地球不是平的&#xff0c;也没有简单的方法把它放在一张平面纸地图上&#xff08;或电脑屏幕上&#xff09;&#xff0c;所以人们想出了各种巧妙的解决方案&#xff08;投影&#xff09;。 每种投影方案都有优点和缺点&#xff0c;一…

LabVIEW使用单板RIO开发远程监控电源信号

LabVIEW使用单板RIO开发远程监控电源信号 设计和构建用于智能电网的本地功耗分析系统&#xff0c;主要服务于领先的电力监控设备设计者和制造商。随着智能电网投资的增加&#xff0c;对于能够有效处理替代电源&#xff08;如太阳能和风能&#xff09;间歇性功率水平的技术需求…

揭秘强化学习:Python 实践指南

一、说明 强化学习 (RL) 是机器学习和人工智能 (AI) 的一个子领域&#xff0c;专注于开发能够通过与环境交互进行学习的智能代理。与传统的监督和无监督学习不同&#xff0c;强化学习主要关注动态、顺序环境中的决策。它在人工智能中具有重要意义&#xff0c;特别是在自主代理必…

数字与数学基础问题

关卡名 数字与数学基础问题 我会了✔️ 内容 1.数字里统计的处理技巧 ✔️ 2.必须熟练掌握溢的处理方法 ✔️ 3.掌握进制的处理方法 ✔️ 1. 数字统计专题 统计一下特定场景下的符号&#xff0c;或者数字个数等是一类非常常见的问题 。如果按照正常方式强行统计&#xf…

MX6ULL学习笔记 (八) platform 设备驱动实验

前言&#xff1a; 什么是 Linux 下的 platform 设备驱动 Linux下的字符设备驱动一般都比较简单&#xff0c;只是对IO进行简单的读写操作。但是I2C、SPI、LCD、USB等外设的驱动就比较复杂了&#xff0c;需要考虑到驱动的可重用性&#xff0c;以避免内核中存在大量重复代码&…

uc_13_共享内存_消息队列_IPC对象

1 IPC对象 多个IPC -> 一个IPC对象 -> 一个IPC对象标识符 -> 一个键(整数)(即IPC对象的外部名称) 共享内存、消息队列和信号量&#xff0c;这三种IPC一般被合称为XSI IPC&#xff0c;它们有很多相似之处。 为了实现进程间的数据交换&#xff0c;系统内核会为参…

dockerfile简单实践部署(jenkins,wordpress)

实现部署jenkins的流程 配置java环境&#xff0c;导入jenkins包&#xff0c;运行命令 java -jar jenkins包&#xff0c;这里为了减少进入jenkins的web端安装插件&#xff0c;将插件提前部署到容器内。 制作dockerfile 创建镜像所在的文件夹和Dockerfile文件 mkdir /test cd …