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

栈介绍

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

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

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

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

分析

使用数组来模拟栈的实现,首先考虑到数组的长度是固定的,所以使用栈就必须给一个特定的长度,即最大长度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();
 }

}

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

(0)

相关推荐

  • Java中使用数组实现栈数据结构实例

    栈是Java语言中最重要的数据结构之一,它的实现,至少应该包括以下几个方法: 1.pop() 出栈操作,弹出栈顶元素. 2.push(E e) 入栈操作 3.peek() 查看栈顶元素 4.isEmpty() 栈是否为空 另外,实现一个栈,还应该考虑到几个问题: 1.栈的初始大小以及栈满以后如何新增栈空间 2.对栈进行更新时需要进行同步 简单示例,使用数组实现栈,代码如下: 复制代码 代码如下: public class Stack<E> { // Java 不支持泛型数组,如需使用,请使用J

  • 浅谈Java数组的一些使用方法及堆栈存储

    数组 用于存储一组同一数据类型数据的容器 数组会对放入其中的数据自动编号,编号是从0开始的---下标 定义格式 数据类型[] 数组名 = new 数据类型[数组的大小];---可以先声明再初始化 int[] arr = new int[5];---定义了一个最多能存储5的整数的数组 arr[3] = 4; arr[3]---通过数组名[下标]的形式来获取数组元素或者给对应的位置赋值 数据类型[] 数组名 = new 数据类型[]{元素1,元素2--}; int[] arr = new int[]

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

    栈介绍 栈是一个先入后出的有序列表. 栈是限制线性表中元素的插入和删除只能在线性表中同一端进行的一种特殊的线性表,允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端,称为栈底. 最先放入栈中的元素在栈底,最后放入的元素在栈顶. 最先出栈的元素在栈顶,最后出栈的元素在栈底. 分析 使用数组来模拟栈的实现,首先考虑到数组的长度是固定的,所以使用栈就必须给一个特定的长度,即最大长度MaxSize.自定义一个栈顶指针, 初始化数据为-1,因为数组的索引值是从0开始的,为了不引起冲突,从-1

  • Java利用数组随机抽取幸运观众如何实现

    编写程序,事先将所有观众姓名输入数组,然后获得数组元素的总数量,最后在数组元素中随机抽取元素的下标,根据抽取的下标获得幸运观众的姓名. 思路如下: 定义输入框的按键事件,使用KeyEvent类的getKeyChar()函数判断其是否是回车字符,若不是则不作处理:使用isEmpty()函数判断文本框中是否有字符串,如果没有字符串则不做处理:若为合法输入则通过JTextArea类的append()方法把输入人名与回车符添加到人员列表:使用selectAll()方法选择文本框所有字符:定义点击"抽取&

  • java利用数组随机抽取幸运观众

    本文实例为大家分享了java利用数组随机抽取幸运观众的具体代码,供大家参考,具体内容如下 思想: 首先将所有观众姓名生成数组,然后获取数组元素的总数量,再在数组元素中随机抽取元素的下标,根据元素的下标得到幸运观众的名字. import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.E

  • JAVA基于静态数组实现栈的基本原理与用法详解

    本文实例讲述了JAVA基于静态数组实现栈.分享给大家供大家参考,具体如下: 1.栈的定义 栈是一种"先进后出"的一种线性数据结构,有压栈出栈两种操作方式.如下图: 2.栈的分类 栈主要分为两类: 静态栈 动态栈 [静态栈] 静态栈的核心是数组,类似于一个连续内存的数组,我们只能操作其栈顶元素. [动态栈] 静态栈的核心是数组,类似于一个连续内存的数组,我们只能操作其栈顶节点. 此节我们在我们之前封装的动态数组的基础上(引用封装好的动态数组),实现基本的栈操作. 3.栈实现 1.先定义一

  • JavaScript数据结构学习之数组、栈与队列

    前言 数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合. 常用的数据结构有: 数组,队列(queue),堆(heap),栈(stack),链表(linked list ),树(tree),图(graph)和散列表(hash) 本文主要介绍的是数组.栈与队列,下面来一起看看详细的介绍吧. 一.数组 数组是平时使用最常用的数据结构,在JavaScript中数组是动态的分配大小,在这里我不会介绍JavaScript里面数组的所有的方法,而是针对数据结构这个方向谈谈所用到的方法

  • C++利用循环和栈实现走迷宫

    本文实例为大家分享了C++利用循环和栈实现走迷宫的具体代码,供大家参考,具体内容如下 要求: 1.将地图的数组保存在文件中,从文件中读取行列数 2..动态开辟空间保存地图 3..运行结束后再地图上标出具体的走法 说明: 1.文件中第一行分别放置的是地图的行数和列数 2.其中1表示墙,即路不通,0表示路,即通路 3.程序运行结束后用2标记走过的路径 4.当走到"死胡同"时用3标记此路为死路 5.每到一个点,按照 左 上 右 下 的顺序去试探 6.没有处理入口就是"死胡同&quo

  • 深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)

    继承是OO语言中的一个最为人津津乐道的概念. 许多OO语言都支持两种继承方式:接口继承和实现继承. 接口继承只继承方法签名,而实现继承则继承实际的方法. 如其所述,由于函数没有签名,在ECMAScript中无法实现接口继承. ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的. 1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法. 2.有时候需要传递大量可选参数的情形时,一

  • 如何利用反射批量修改java类某一属性的代码详解

    下面看下代码,具体代码如下所示: package utils.copyProperty; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; public class CopyProperty { public static Pro

  • C语言利用数组和文件实现登录注册功能

    C语言利用文件系统实现简单的用户登录和注册功能 版本一:利用数组 最近有个朋友让我帮他做一个C语言的登录注册功能,考虑到他没有学到数据库于是想到了存入文件 此版本使用的数组,第二个版本使用的是链表,链表是一个很好的数据结构,推荐大家用链表 第二版:链接 话不多说上代码 #include <stdio.h> #include <stdlib.h> #define USER_MAX 20 //此系统能存放最多的用户数 typedef struct { char name[10]; ch

随机推荐