java学习笔记(基础篇)—数组模拟实现栈
栈的概念
- 先进后出策略(LIFO)
- 是一种基本数据结构
- 栈的分类有两种:1.静态栈(数组实现) 2.动态栈(链表实现)
- 栈的模型图如下:

需求分析
在编写代码之前,我习惯先对要实现的程序进行需求分析,比如用什么数据结构存储数据,需要实现哪些基本的功能等。这次是通过数组模拟实现栈,所以是一个静态栈,但是我在栈满时通过arraycopy函数自动扩容,后面会细说。
我们要实现的功能至少应该包含以下功能:
public class Stack {
private int[] array;//模拟栈
private int length = 0;//栈总长度
private int size = 0;//栈存在元素个数
public Stack() {
this(10);
}
public Stack(int length) {
array = new int[length];
this.length = length;
}
//入栈
public void push(int num) {}
//出栈
public int pop() {}
//栈是否为空
public boolean isEmpty() {}
//栈是否已满,已满则每次扩容5个单位
public boolean isFull() {}
//清除栈所有元素
public void removeAll() {}
//获取栈内存在元素个数
public int getSize() {}
//获取栈的总长度
public int getLength() {}
}
具体实现
- 入栈push()
首先判断当前栈是否已满,如果已满则扩容;此时栈内存在元素size增加1。
//入栈
public void push(int num) {
isFull();
array[length-1-size] = num;
size++;
}
- 出栈pop()
判断当前栈是否为空,为空则返回0;不为空,将数组中最靠近下标0的非0元素置0;此时栈内元素size减1,并返回出栈的值;
//出栈
public int pop() {
if(isEmpty()) {
return 0;
}
int result = 0;
for (int i = 0; i < array.length; i++) {
if (array[i]==0) {
continue;
}
result = array[i];
array[i] = 0;
size--;
break;
}
return result;
}
- 栈是否为空isEmpty()
//栈是否为空
public boolean isEmpty() {
if(size==0) {
System.out.println("栈为空!");
return true;
}
return false;
}
- 栈是否已满,已满则每次扩容5个单位isFull()
如果栈内存在的元素个数等于数组长度,则表示栈已满;通过new一个新的更大的数组,调用arraycopy方法将b的引用赋给array,并且数组的长度也要加长。
arraycopy()的参数含义如下:
/**
* 参数含义
* @param src 原数组对象的引用
* @param srcPos 原数组要拷贝的数据的原始位置
* @param dest 目标数组对象的引用
* @param destPos 目标数组要拷贝的数据的原始位置
* @param length 原数组要拷贝的长度
*/
public static native void arraycopy(Object src, int srcPos,Object dest, int destPos, int length);
//栈是否已满,已满则每次扩容5个单位
public boolean isFull() {
if (size==length) {
//System.out.println("当前栈已满,扩容5个单位。");
int[] b = new int[length+5];
System.arraycopy(array, 0, b, 5, length);
array = b;
this.length += 5;
return true;
}
return false;
}
- 清除栈所有元素removeAll()
清除所有元素就是遍历一遍数组,将全部元素的值置0;
//清除栈所有元素
public void removeAll() {
for (int i = 0; i < array.length; i++) {
if (array[i]!=0) {
array[i] = 0;
size--;
}
}
}
- 获取栈内存在元素个数getSize()
//获取栈内存在元素个数
public int getSize() {
return size;
}
- 获取栈的总长度getLength()
//获取栈的总长度
public int getLength() {
return length;
}
测试
public class StackTest {
public static void main(String[] args) {
//创建一个默认长度为10的栈
Stack stack = new Stack(2);
//入栈
stack.push(10);
stack.push(9);
stack.push(8);
System.out.println("当前栈元素个数:"+stack.getSize());
System.out.println("当前栈的总长度:"+stack.getLength());
stack.printStack();
//出栈
int p = stack.pop();
System.out.println("当前出栈元素的值:"+p);
System.out.println("当前栈元素个数:"+stack.getSize());
System.out.println("当前栈的总长度:"+stack.getLength());
stack.printStack();
//清空栈
stack.removeAll();
//stack.isEmpty();
int p2 = stack.pop();
System.out.println("当前出栈元素的值:"+p2);
System.out.println("当前栈元素个数:"+stack.getSize());
System.out.println("当前栈的总长度:"+stack.getLength());
}
}
测试结果:
当前栈元素个数:3
当前栈的总长度:7
当前栈情况:8 9 10
当前出栈元素的值:8
当前栈元素个数:2
当前栈的总长度:7
当前栈情况:9 10
栈为空!
当前出栈元素的值:0
当前栈元素个数:0
当前栈的总长度:7
欢迎访问我的个人网站www.chlinlearn.cn
到这里就要结束了,后续如果有时间也会出一篇链表实现栈的文章,欢迎来访问我的个人网站,最新文章都会首先在那里发布哦^^
java学习笔记(基础篇)—数组模拟实现栈的更多相关文章
- java学习笔记-基础篇
Java基础篇 1—12 常识 13 this关键字 14参数传递 16 继承 17 访问权限 28—31异常 1—12 常识 1.文件夹以列表展示,显示扩展名,在地址栏显示全路径 2.javac编译 ...
- Java学习笔记——基础篇
Tips1:eclipse中会经常用到System.out.println方法,可以先输入syso,然后eclipse就会自动联想出这个语句了!! 学习笔记: *包.权限控制 1.包(package) ...
- java学习笔记(基础篇)—java数组
一:什么是数组,什么时候使用数组? 数组是用来保存一组数据类型相同的元素的有序集合,数组中的每个数据称为元素.有序集合可以按照顺序或者下标取数组中的元素. 在Java中,数组也是Java对象.数组中的 ...
- java学习笔记(基础篇)--java关键字与数据类型
java关键字与数据类型 Java语言的关键字是程序代码中的特殊字符.包括: . 类和接口的声明--class, extends, implements, interface . 包引入和包声明--i ...
- java学习笔记(基础篇)—面向对象编程之封装、继承、多态
一. OOP中的基本概念 Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP), 它允许设计者将面向对象设计实现为一 ...
- java学习笔记(基础篇)—变量与表达式
一:局部变量和实例变量 定义变量是指设定变量的数据类型和变量的名字,Java语言要求变量遵循先定义,再初始化,然后使用的规则. 作用域:指它的存在范围,只有在这个范围内,程序代码才能访问它. 变量的生 ...
- java学习笔记(基础篇)—抽象与接口的区别
抽象与接口的区别 一.抽象(abstract) 1. 抽象方法 1) 作用:定义规范 2) 抽象方法用来描述具有什么功能,但不提供实现. 3) 如果类中一个方法没有实现就要定义一个抽象方法. 2. 抽 ...
- Python学习笔记基础篇——总览
Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...
- Java学习日记基础篇(七) —— 数组、排序
数组 为什么要有数组? 案例:一个养鸡场有六只鸡,他们的体重分别为3kg,5kg,1kg,3.4kg,2kg,50kg.请问这六只鸡的总体重和平均体重是多少? public class test5 { ...
随机推荐
- 匹配中文字符的正则表达式: [/u4e00-/u9fa5]
原文:匹配中文字符的正则表达式: [/u4e00-/u9fa5] 这里是几个主要非英文语系字符范围(google上找到的): 2E80-33FFh:中日韩符号区.收容康熙字典部首.中日韩辅助部首.注音 ...
- eclipse 插件编写(四)
前言 前面几篇文章讲了下如果编写简单的eclipse插件,如创建插件项目.编写右键弹出菜单等功能,接下来主要写一下如何生成代码的功能,这一片的功能跟插件本身的编写关联不太大,主要处理插件之后的业务内容 ...
- PHP 的魔术方法及其应用
PHP中将所有__(两个下划线)开头的类方法作为魔术方法,这方法之所以称为魔术方法是因为其实现的功能就如变魔术一样感觉很神奇.在特定的事件下触发,这真的很酷. **__construct()** 这个 ...
- js判断图片是否存在
var imageData = Array(); for(var i = 0; i < imageTemp.length; i++){ ajaxSizeRequest = $.ajax({ ty ...
- delphi中最小化其他程序及所有程序最小化(使用 shell.minimizeAll 和自己寻找窗口这两种办法)
1.所有程序最小化 uses ComObj; var shell : OleVariant; begin shell := CreateOleObject('Shell.Appli ...
- QT5---应用程序发布(使用windeployqt和NSIS)
采用动态编译的方式发布程序,即release版本. 找齐动态依赖库(.dll) 方法一 用Dependency Walker这个工具去找少了那些dll,不过这个工具也不怎么靠谱,一个比较靠谱但 ...
- 反汇编分析__stdcall和__cdecl的异同
C++代码如下:.h头文件 #pragma once#ifdef DLLTestAPI#else#define DLLTestAPI _declspec(dllimport)#endifint DLL ...
- 10个有趣的javascript和css库(2019年5月最新)
我们的使命是让您了解最新和最酷的Web开发趋势.这就是为什么我们每个月都会发布一些精选的资源,这些资源是我们偶然发现并认为值得您关注的. 1.Tessaract.js 强大的javascript(节点 ...
- kafka笔记4(2)
提交和偏移量 每次调用poll 方法,总是返回生产者写入Kafka但还没有被消费者读取过的记录我们因此可以追踪到哪些记录时被群组里的哪个消费者读取过的. 我们把更新分区当前位置的操作叫做提交. 那么消 ...
- 章节十四、8-javaScript弹框处理
一.javaScript弹框没有id.也没有xpath,在F12开发者选项中无法直接通过鼠标去选择弹窗来确定元素在代码中的位置. 弹窗有两种,一种实只有"确定"按钮的alert类型 ...