日撸Java三百行(day14:栈)

news2024/9/23 15:24:53

目录

一、栈的基本知识

1.栈的概念

2.栈的功能

3.栈的实现

二、栈的代码实现

1.栈的基本属性与方法

2.栈的遍历

3.入栈实现

4.出栈实现

5.数据测试

6.完整的程序代码

总结


一、栈的基本知识

1.栈的概念

根据百度百科,我们知道“”是存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,栈就是数据暂时存储的地方,当栈中没有数据元素时叫做空栈。

栈(stack),是一种运算受限的线性表,限定只在表尾进行插入和删除操作,插入删除这一端就叫栈顶,另一端就叫栈底,总结一下就是“栈底固定,栈顶浮动”。

而正因为栈运算受限,只能在栈顶进行插入删除操作,所以栈是一种先进后出(后进先出)的数据结构。

2.栈的功能

栈的主要功能有push(入栈)、pop(出栈)、peek(获取栈顶元素,但不删除)、empty(判断栈是否为空)等,这里我们重点讨论入栈和出栈。

入栈:即向一个栈插入新元素,把新元素放到原栈顶元素的上面,使之成为新的栈顶元素。

出栈:即从一个栈中删除元素,把原栈顶元素删除,使其相邻的元素成为新的栈顶元素。

为了更好地理解栈的基本概念与入栈出栈,下面用图进行说明:

3.栈的实现

因为栈存储的是相同类型的数据,所以栈的实现有两种,一种是顺序栈,底层为数组;另一种是链式栈,利用链表实现。今天我们主要通过数组(顺序表)来完成栈的实现。

二、栈的代码实现

1.栈的基本属性与方法

有了前几天顺序表和链表的相关基础,创建栈的基本属性和方法就可以很快完成,代码如下:

public class CharStack {
	/**
	 * The depth.
	 */
	public static final int MAX_DEPTH = 10;
	
	/**
	 * The actual depth.
	 */
	int depth;
	
	/**
	 * The data.
	 */
	char[] data;
	
	/**
	 *********************
	 * Construct an empty char stack.
	 *********************
	 */
	public CharStack() {
		depth = 0;
		data = new char[MAX_DEPTH];
	} // of the first constructor

这里我们同样利用final关键字来定义栈的最大长度MAX_DEPTH = 10,然后定义成员变量(depth、data),再利用new关键字为data分配内存空间。

2.栈的遍历

栈的遍历同样可以通过重写toString()方法来实现,大体结构上与顺序表、链表差不多,只是循环的时候,要注意由于栈是在栈顶这一端进行插入删除操作,所以为了便于后续入栈和出栈,我们将栈顶端对应数组的最右端(下标最大处),代码如下:

    /**
	 *********************
	 * Overrides the method claimed in Object, the superclass of any class.
	 *********************
	 */
	public String toString() {
		String resultString = "";
		
		for (int i = 0; i < depth; i++) {
			resultString += data[i];
		} // of for i
		
		return resultString;
	} // of toString

3.入栈实现

和顺序表、链表一样,在入栈之前,我们显然需要先考虑此栈是否已满,对于这个问题,一样的套路,直接利用if语句进行判断:

  • 如果此时栈的长度depth = MAX_DEPTH,那么就输出Stack full.,提示此栈已满。
  • 如果此时栈的长度未达到MAX_DEPTH,说明栈还未满,直接将插入元素令为新的栈顶元素即可完成入栈。我们知道在插入前,原栈顶元素的下标为depth - 1(因为栈底从0开始索引),那么显然新栈顶元素的下标应在此基础上加1,所以data[depth] = paraChar;,最后不要忘了把栈的实际长度depth增加1(因为插入了一个新元素)。
    /**
	 *********************
	 * Push an element.
	 * 
	 * @param paraChar The given char.
	 * @return Success or not.
	 *********************
	 */
	public boolean push(char paraChar) {
		if (depth == MAX_DEPTH) {
			System.out.println("Stack full.");
			return false;
		} // of if
		
		data[depth] = paraChar;
		depth++;
		
		return true;
	} // of push

4.出栈实现

顺序表、链表执行删除操作之前需要先判断是否为空表,类似的,在执行出栈操作之前,也需要先判断栈是否为空,这里仍然用的是if语句进行判断,并将'\0'作为返回值。

出栈其实就是删除栈顶元素,也就是删除栈最上面的元素(数组最右边的元素),所以直接将栈的长度depth减少1即可,不过,在此之前还是需要将要删除的栈顶元素赋给resultChar并返回。

    /**
	 *********************
	 * Pop an element.
	 * 
	 * @return The popped char.
	 *********************
	 */
	public char pop() {
		if(depth == 0) {
			System.out.println("Nothing to pop.");
			return '\0';
		} // of if
		
		char resultChar = data[depth - 1];
		depth--;
		
		return resultChar;
	} // of pop

5.数据测试

接下来我们照例进行数据测试:

    /**
	 *********************
	 *The entrance of the program.
	 *
	 * @param args Not used now.
	 *********************
	 */
	public static void main(String[] args) {
		CharStack tempStack = new CharStack();
		
		for(char ch = 'a'; ch < 'm'; ch++) {
			tempStack.push(ch);
			System.out.println("The current stack is: " + tempStack);
		} // of for ch
		
		char tempChar;
		for(int i = 0; i < 12; i++) {
			tempChar = tempStack.pop();
			System.out.println("Popped: " + tempChar);
			System.out.println("The current stack is: " + tempStack);
		} // of for i
	} // of main

6.完整的程序代码

package datastructure;

/**
 *Char stack. I do not use Stack because it is already defined in Java.
 *
 *@auther Xin Lin 3101540094@qq.com.
 */

public class CharStack {
	/**
	 * The depth.
	 */
	public static final int MAX_DEPTH = 10;
	
	/**
	 * The actual depth.
	 */
	int depth;
	
	/**
	 * The data.
	 */
	char[] data;
	
	/**
	 *********************
	 * Construct an empty char stack.
	 *********************
	 */
	public CharStack() {
		depth = 0;
		data = new char[MAX_DEPTH];
	} // of the first constructor
	
	/**
	 *********************
	 * Overrides the method claimed in Object, the superclass of any class.
	 *********************
	 */
	public String toString() {
		String resultString = "";
		
		for (int i = 0; i < depth; i++) {
			resultString += data[i];
		} // of for i
		
		return resultString;
	} // of toString
	
	/**
	 *********************
	 * Push an element.
	 * 
	 * @param paraChar The given char.
	 * @return Success or not.
	 *********************
	 */
	public boolean push(char paraChar) {
		if (depth == MAX_DEPTH) {
			System.out.println("Stack full.");
			return false;
		} // of if
		
		data[depth] = paraChar;
		depth++;
		
		return true;
	} // of push
	
	/**
	 *********************
	 * Pop an element.
	 * 
	 * @return The popped char.
	 *********************
	 */
	public char pop() {
		if(depth == 0) {
			System.out.println("Nothing to pop.");
			return '\0';
		} // of if
		
		char resultChar = data[depth - 1];
		depth--;
		
		return resultChar;
	} // of pop
	
	/**
	 *********************
	 *The entrance of the program.
	 *
	 * @param args Not used now.
	 *********************
	 */
	public static void main(String[] args) {
		CharStack tempStack = new CharStack();
		
		for(char ch = 'a'; ch < 'm'; ch++) {
			tempStack.push(ch);
			System.out.println("The current stack is: " + tempStack);
		} // of for ch
		
		char tempChar;
		for(int i = 0; i < 12; i++) {
			tempChar = tempStack.pop();
			System.out.println("Popped: " + tempChar);
			System.out.println("The current stack is: " + tempStack);
		} // of for i
	} // of main
} // of class CharStack

运行结果:

入栈时:测试的数据是从'a'到'm'之前(即从'a'到'l'这12个数据元素) ,但是在程序最开始我们就已经规定了栈的最大长度为10,所以不用说,当执行入栈操作时,最后'k'、'l'这两个数据元素必然没办法完成入栈。

出栈时:我们设置了for循环的次数为12次,即需要执行12次出栈操作,但是此时栈中只有'a'~'j'这10个数据元素,所以最后两次出栈时Nothing to pop.

总结

总的来说,今天的代码还是比较容易的,一方面是因为有了前两天顺序表和链表的基础,另一方面是因为栈的操作本身就不复杂,而且入栈出栈的时间复杂度均为O(1),所以利用栈来存取数据是比较迅速的。不过,栈虽然操作不复杂,但是它在计算机领域却有着举足轻重的作用,栈不仅是一种高效的内存结构,还贡献于计算机底层技术(例如函数调用、中断处理、程序调试等)。

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

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

相关文章

小怡分享之Java图书管理系统

前言&#xff1a; &#x1f308;✨前面小怡给大家分享了抽象类和接口&#xff0c;今天小怡给大家分享用Java实现图书管理系统。 1.功能 不同的用户看到的菜单是不一样的&#xff0c;我们分为两个用户身份&#xff0c;管理员和普通用户。 2.知识点 数据类型、变量、数组、方法…

跳妹儿学编程之ScratchJr(12):综合篇-五只小猴子床上跳

博主资深软件架构师&#xff0c;拥有13年大型软件与互联网系统开发、设计和架构经验&#xff0c;曾就职于华为&#xff0c;现任职于国内知名互联网公司。平时在家教咱家“跳妹儿”编程&#xff0c;并将心得和过程记录下来。希望可以帮助更多对编程感兴趣的家庭。 引言 在前面的…

略读ArrayList源码

ArrayList是Java集合框架中的一部分&#xff0c;底层是通过数组实现的&#xff0c;可以动态增长和缩减。 一、首先看成员变量 序列化ID定义。在Java中&#xff0c;如果一个类实现了Serializable接口&#xff0c;那么它的serialVersionUID就非常重要了。serialVersionUID用于确…

Cesium初探-CallbackProperty

在Cesium中&#xff0c;CallbackProperty 是一种非常有用的特性&#xff0c;可以用来动态更新实体的属性&#xff0c;如位置、方向、高度等。CallbackProperty 允许你在指定的时间点计算属性值&#xff0c;这样就可以实时地改变实体的状态而不需要频繁地重新设置整个属性。 下…

PCIe学习笔记(16)

层次结构&#xff08;Hierarchy&#xff09;ID Message &#xff08;PCIe I/O 互连的树形拓扑结构称为 PCIe 的 Hierarchy&#xff0c;或称层级、层次&#xff08;不是事务层、数据链路层的“层”&#xff09;。层次区域是指与 RC 某一 RP 相关联的所有设备和链路组成的线路结…

【Linux课程学习】:对于权限的理解(粘滞位)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 这篇文章主要理解权限的概念&#xff0c;以及如何更改…

CSS:图片间空白间距问题的解决方案

一、问题描述 今天有小伙伴遇到多张图片排版显示时中间存在空白间隙&#xff0c;问如何处理&#xff1a; <div> <img width"100%" src"https:/xxx.png" id"1747098" style"max-width:100%;"><img width"100%&qu…

学习进行到了第十七天(2024.8.5)

1.Mybatis的定义 数据持久化是将内存中的数据模型转换为存储模型&#xff0c;以及将存储模型转换为内存中数据模型的统称。例如&#xff0c;文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。MyBatis 支持定制化 SQL、存储过程以及高级映射&#xff0c;可以…

【leetcode详解】另一棵树的子树 (C++递归:思路精析 过程反思)

思路详解&#xff1a; 总体框架&#xff1a; 对root树进行先序遍历&#xff0c;如果当前结点&#xff08;记为cur&#xff09;的值和subRoot的根节点值相等时&#xff0c;就开始判断 以cur为根节点的树 和 子树 是否结构一样? 如何判断两棵树是否结构完全相同&#xff1f; …

Docker Remote API未授权访问漏洞

9.Docker Remote API未授权访问漏洞 步骤一:使用以下Fofa语句对Docker产品进行搜索. port"2375" 步骤二:直接使用浏览器访问以下路径 /version#查看版本信息 /info#查看容器信息 漏洞修复 1.端口访问控制 对2375端口做网络访问控制&#xff0c;如设置iptables…

人工智能时代程序员生存法则

随着AIGC&#xff08;如chatgpt、midjourney、claude等&#xff09;大语言模型接二连三的涌现&#xff0c;AI辅助编程工具日益普及&#xff0c;程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工作&#xff0c;也有人认为AI是提高效率的得力助手。面对这一趋势,…

什么是亚马逊测评?亚马逊测评的技术要求有哪些?

今天将深入探讨亚马逊测评&#xff0c;这一备受关注的轻资产创业项目&#xff0c;吸引了众多创业者的目光。为了帮助大家更好地理解亚马逊测评&#xff0c;将回答一些常见问题&#xff0c;并分享相关知识。 什么是亚马逊测评&#xff1f; 亚马逊测评是为亚马逊商家提供的一项…

2011-2023各省数字普惠金融指数数据(覆盖广度、使用深度和数字化程度)

2011-2023各省数字普惠金融指数数据 1、时间&#xff1a;2011-2023年 2、指标&#xff1a;数字金融普惠指数、数字金融覆盖广度指数、数字金融使用深度指数、普惠金融数字化程度指数、数字金融使用深度指数下属的支付、保险、货币基金、信用服务、投资、信贷等分类指数 3、范…

【MATLAB源码-第242期】基于matlab的OFDM+QPSK系统莱斯信道Ricain信道估计仿真采用LS方法,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;正交频分复用&#xff09;是一种广泛应用于现代通信系统的多载波传输技术&#xff0c;其主要优点包括高频谱效率、抗多径衰落和抵抗频率选择性衰落。OFDM系统通过将高速数据流分割成多个低速数据流&#xff…

javascript:检测图片的宽高

1 方案描述 JavaScript提供了非常方便的FileReader和Image对象&#xff0c;可以帮助我们轻松实现这个功能。具体步骤如下&#xff1a; 获取文件输入框&#xff1a;首先&#xff0c;我们需要获取到用户选择的文件。读取文件内容&#xff1a;然后&#xff0c;通过FileReader对象…

Servlet概念理解和具体实现

目录 1、C/S架构和B/S架构 &#xff08;1&#xff09;C/S架构 &#xff08;2&#xff09;B/S架构 &#xff08;3&#xff09;B/S架构的技术原理 &#xff08;4&#xff09;CS/BS区别 &#xff08;5&#xff09;B/S技术的工作原理 &#xff08;6&#xff09;什么是URL …

华杉研发九学习日记24 线程同步 死锁 线程通信 线程池 Callable接口

华杉研发九学习日记24 java多线程 一&#xff0c;线程同步 1.1 线程同步问题 多个线程同时操作一个全局数据或静态数据时可能会造成数据冲突 解决&#xff1a; synchronized同步代码块synchronized同步方法使用锁对象加锁解锁 // 火车站卖车票 -- 100张 public class…

Django ASGI服务

1. ASGI简介 在Django中, ASGI(Asynchronous Server Gateway Interface)的引入使得Django应用能够支持异步编程. 从Django 3.0开始, Django就增加了对ASGI的支持, 但直到Django 3.1才正式推荐在生产环境中使用ASGI. ASGI是一个用于Python的异步Web服务器的标准接口, 它允许你运…

图解RocketMQ之消息如何存储

大家好&#xff0c;我是苍何。 人一辈子最值得炫耀的不应该是你的财富有多少&#xff08;虽然这话说得有点违心&#xff0c;呵呵&#xff09;&#xff0c;而是你的学习能力。技术更新迭代的速度非常快&#xff0c;那作为程序员&#xff0c;我们就应该拥有一颗拥抱变化的心&…

西安交通大学先进动力与新能源发展峰会举行

8月3日&#xff0c;西安交通大学第十届先进动力与新能源发展峰会暨西安交大先进动力校友会2024年年会在深圳举行。西安交通大学党委常委、副校长单智伟&#xff0c;南方科技大学清洁能源研究院院长、创新创业学院院长、澳大利亚国家工程院外籍院士刘科&#xff0c;西安交通大学…