首页 > 编程语言 >日撸Java三百行(day14:栈)

日撸Java三百行(day14:栈)

时间:2024-08-05 20:58:04浏览次数:10  
标签:char Java 入栈 三百 day14 depth return data public

目录

一、栈的基本知识

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("Poped: " + 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 [email protected].
 */

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("Poped: " + 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),所以利用栈来存取数据是比较迅速的。不过,栈虽然操作不复杂,但是它在计算机领域却有着举足轻重的作用,栈不仅是一种高效的内存结构,还贡献于计算机底层技术(例如函数调用、中断处理、程序调试等)。

标签:char,Java,入栈,三百,day14,depth,return,data,public
From: https://blog.csdn.net/2301_80594618/article/details/140931383

相关文章

  • 日撸Java三百行(day13:链表)
    目录一、链表的基础知识二、链表的代码实现1.链表创建2.链表遍历3.链表定位查找4.链表插入5.链表删除6.数据测试7.完整的程序代码总结一、链表的基础知识在之前顺序表的学习中,我们其实提到过链表。链表它是线性表在不同的物理存储方式下派生出来的,链表不像顺序表......
  • 【报错提示】java.lang.RuntimeException: Can't create handler inside thread
    ​报错提示遇到一个报错: java.lang.RuntimeException:Can'tcreatehandlerinsidethreadThread[OkHttphttps://a.fxltsbl.com/...]thathasnotcalledLooper.prepare() 分析 1.这个报错提示是在一个没有调用Looper.prepare()的线程中尝试创建一个Handler对象......
  • JAVA变量类型
    一个类可以包含以下类型变量:局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法......
  • java8-常用类型(包装类,BigDecimal,Date等)
    1.包装类1.1包装类简介java语言是面向对象的语言,但是其中的八大基本数据类型不符合面向对象的特征。因此java为了弥补这样的缺点,为这八种基本数据类型专门设计了八种符合面向对象特征的的类型,这八种具有面向对象特征的类型,统称为包装类,英文单词:wrapperclass。包装类,就是......
  • java9-泛型
    1.泛型的简介1.1什么是泛型        泛型是一种特殊的数据类型。它是Java的一个高级特性。在Mybatis、Hibernate这种持久化框架,泛型更是无处不在。在这之前,不管我们在定义成员变量时,还是方法的形参时,都要规定他们的具体类型。所以提出猜想,有没有一种可能,一次声......
  • JSON parse error: Cannot deserialize instance of `java.lang.Long` out of START_O
    这个问题的实际原因就是:    后端id(Long类型)用的雪花算法生成主键id    后端生成id位:1820397662671867904    前端查询id的结果为:1820397662671868000产生的原因:    后端生成为19位,前端接受并展示,使用的类型是number类型是16位   ......
  • java计算字符数量
      publicclassCharCountExample{publicstaticvoidmain(String[]args){Stringtext="Hello,world!Howareyou?";chartargetChar='o';intcount=countChar(text,targetChar);System.out.p......
  • JAVA应用CPU跳点自动DUMP工具
    背景在做系统监控时,CPU的使用率是一个关键的指标,它反映了系统的性能稳定性以及是否存在异常情况,能帮助我们了解系统的负载情况。通过监控CPU使用率,可以判断系统是否正常运行或者是否存在性能问题。如果CPU使用率过高,可能表示系统存在资源瓶颈,需要进行优化或升级。CPU监控的难......
  • 计算机毕业设计必看必学!! 85583 springboot高校网上选课系统,原创定制程序, java、PHP
                                                  摘要本论文主要论述了如何使用JAVA语言开发一个高校网上选课系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,......
  • 学习笔记 韩顺平 零基础30天学会Java(2024.8.5)
    P460八大Wrapper类     黄色的父类是number,黑色的是自己独立的P461装箱和拆箱     手动装箱示例:                             intn1=100;                Intergerinterger=newInterger(n1);//......