利用数组实现栈(Java实现)

 更新时间:2019年09月25日 15:32:41   作者:dreamer_it  
这篇文章主要为大家详细介绍了利用数组实现栈,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

栈介绍

栈是一个先入后出的有序列表。

栈是限制线性表中元素的插入和删除只能在线性表中同一端进行的一种特殊的线性表,允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端,称为栈底

最先放入栈中的元素在栈底,最后放入的元素在栈顶。

最先出栈的元素在栈顶,最后出栈的元素在栈底。

分析

使用数组来模拟栈的实现,首先考虑到数组的长度是固定的,所以使用栈就必须给一个特定的长度,即最大长度MaxSize。自定义一个栈顶指针, 初始化数据为-1,因为数组的索引值是从0开始的,为了不引起冲突,从-1开始。

栈为空:当top=-1时,即等于初始化数据,没有任何元素存在数组中,则说明栈为空。

栈满:随着添加元素,栈顶指针将会往后移动,但是要考虑到数组的长度是固定的,就存在一个满的情况。判断条件是当top=MaxSize-1时,栈就满了。比如定义3个大小的数组,放入一个数据1,top从-1变为0,再放入一个数据2,top从0变成1,再放入一个数据3,top从1变成2.这时候数组已经满了,判断条件即为top =MaxSize,为栈满。

进栈:进栈前先判断栈是否满了,否则不能进栈。将top+1,在将数组索引为top的元素赋值为添加进来的数据。

出栈:出栈前先判断栈是否为空,否则不能出栈。如果不为空,先取栈顶的元素,即索引值为top的元素,然后在将top-1。

遍历栈:遍历时也要判断栈中是否为空,遍历数据也是从栈顶元素开始遍历, 一直遍历到栈底就结束了。

代码实现

package cn.mrlij.stack;
 
import java.util.Arrays;
import java.util.Scanner;
 
/**
 * 使用数组实现栈
 * 
 * @author dreamer
 *
 */
public class ArrayStackDemo {
 public static void main(String[] args) {
 // 测试
 ArrayStack a = new ArrayStack(5);
 boolean flag = true;// 用于判断循环结束的标志
 Scanner sc = new Scanner(System.in);
 String key = "";// 用于接受菜单的选项
 while (flag) {
 System.out.println("show:显示栈");
 System.out.println("exit:退出程序");
 System.out.println("push:进栈");
 System.out.println("pop:出栈");
 key = sc.nextLine();
 switch (key) {
 case "show":
 a.show();
 break;
 case "exit":
 flag = false;
 System.out.println("程序结束!");
 break;
 
 case "push":
 
 System.out.println("请输入要进栈的数据:");
 int val = sc.nextInt();
 a.push(val);
 
 break;
 case "pop":
 try {
 int pop = a.pop();
 System.out.println("出栈的值是:" + pop);
 } catch (Exception e) {
 // TODO: handle exception
 System.out.println(e.getMessage());
 }
 break;
 default:
 break;
 }
 
 }
 
 }
}
 
class ArrayStack {
 private int MaxSize;// 定义数组的最大长度
 private int[] arr;// 定义数组,数据就放在该数组
 private int top = -1;// 定义栈顶,初始化数据为-1
 
 public ArrayStack(int maxSize) {
 this.MaxSize = maxSize;
 arr = new int[MaxSize];
 }
 
 // 判断数组是否为空
 public boolean isEmpty() {
 
 return top == -1;
 }
 
 // 判断数组是否满了
 public boolean isFull() {
 System.out.println("栈顶:" + top + "最大长度:" + MaxSize);
 return top == MaxSize - 1;
 }
 
 // 进栈
 public void push(int val) {
 // 先判断栈是否满了,满了就不能添加进去
 if (isFull()) {
 System.out.println("栈已经满了~~");
 return;
 }
 top++;
 arr[top] = val;
 }
 
 // 出栈
 public int pop() {
 // 先判断栈是否为空
 if (isEmpty()) {
 throw new RuntimeException("栈为空,无法出栈!");
 }
 int val = arr[top];
 top--;
 return val;
 }
 
 public void show() {
 if (isEmpty()) {
 System.out.println("没有数据");
 return;
 }
 for (int i = top; i >= 0; i--) {
 System.out.print(arr[i] + "\t");
 }
 System.out.println();
 }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • springmvc+kindeditor文件上传实例详解

    springmvc+kindeditor文件上传实例详解

    这篇文章主要为大家详细介绍了springmvc+kindeditor文件上传实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • SpringBoot获取当前运行环境三种方式小结

    SpringBoot获取当前运行环境三种方式小结

    在使用SpringBoot过程中,我们只需要引入相关依赖,然后在main方法中调用SpringBootApplication.run(应用程序启动类.class)方法即可,那么SpringBoot是如何获取当前运行环境呢,接下来由小编给大家介绍一下SpringBoot获取当前运行环境三种方式,需要的朋友可以参考下
    2024-01-01
  • RabbitMQ排他性队列Exclusive Queue详解

    RabbitMQ排他性队列Exclusive Queue详解

    这篇文章主要介绍了RabbitMQ排他性队列Exclusive Queue详解,如果你想创建一个只有自己可见的队列,即不允许其它用户访问,RabbitMQ允许你将一个Queue声明成为排他性的Exclusive Queue,需要的朋友可以参考下
    2023-08-08
  • Maven 版本管理与 flatten-maven-plugin 插件的使用解析

    Maven 版本管理与 flatten-maven-plugin 插件的使用解析

    这篇文章主要介绍了Maven 版本管理与 flatten-maven-plugin 插件的使用解析,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Spring标准的xml文件头实例分析

    Spring标准的xml文件头实例分析

    这篇文章主要介绍了Spring标准的xml文件头实例分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 并发编程之Java内存模型顺序一致性

    并发编程之Java内存模型顺序一致性

    这篇文章主要介绍了并发编程Java内存模型顺序一致性,顺序一致性内存模型是一个理论参考模型,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照,下面我们一起进入文章看看学校内容,需要的朋友可以参考一下
    2021-11-11
  • mybatis插件pageHelper实现分页效果

    mybatis插件pageHelper实现分页效果

    这篇文章主要为大家详细介绍了mybatis插件pageHelper实现分页效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Springboot升级至2.4.0中出现的跨域问题分析及修改方案

    Springboot升级至2.4.0中出现的跨域问题分析及修改方案

    这篇文章主要介绍了Springboot升级至2.4.0中出现的跨域问题分析及修改方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java源码解析之Gateway请求转发

    Java源码解析之Gateway请求转发

    今天给大家带来的是关于Java的相关知识,文章围绕着Gateway请求转发展开,文中有非常详细介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Spring Boot 集成Elasticsearch模块实现简单查询功能

    Spring Boot 集成Elasticsearch模块实现简单查询功能

    本文讲解了Spring Boot集成Elasticsearch采用的是ES模板的方式实现基础查询,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-06-06

最新评论