栈是一个先入后出的有序列表,栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表,一端为变化的一端,称为栈顶,另一端是固定的,称为栈底。先入的元素在栈底,最后放入的元素在栈顶,删除时后放入的元素先删除,最先放入的元素最后删除。

老师在这里讲解的只有用数组模拟栈,书写类ArrayStack,其中定义一个int类型的变量top来记录栈顶索引,一个数组来记录数据,一个int类型的变量maxSize来记录栈的最大尺寸即可容纳的数据个数。

代码如下:

class ArrayStack{
public int top=-1;
public int[] stack;
public int maxSize; public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack=new int[maxSize];
}
public boolean isFull(){
if(top==maxSize-1) return true;
return false;
}
public boolean isEmpty(){
if(top==-1) return true;
return false;
}
public void push(int value){
if(isFull()){
System.out.println("栈满,无法加入");
return;
}
top++;//先加栈顶再赋值
stack[top]=value;
}
public int pop(){
if(isEmpty()){
throw new RuntimeException("栈空,没有数据");
}
int value=stack[top];
top--;
return value;
}
public void list(){
if(isEmpty()){
System.out.println("栈空,没有数据");
}
for(int i=top;i>=0;i--){
System.out.printf("stack[%d]=%d",i,stack[i]);
}
}
}

老师留了课后作业,让我们 用链表代替数组来书写栈,在很多次的修改和斟酌以后,我的最后设想如下:首先链表的节点中有三个变量,代表编号的no变量,代表具体数据的data变量和一个ArrayStack变量next来指向下一个节点。不再额外定义链表类来管理节点,直接定义链表栈类来管理节点,其中有两个变量,代表最大可容纳数据的maxSize,和一个头节点代表链表。在原先变量top的改变上我最开始想另外定义一个节点为top来指向栈顶。但在试验后发现并没有这种必要,因为此处我使用的是头插法,所以栈顶永远都是head.next,不需另外定义。另外,在判断栈空和栈满时我发现十分麻烦,所以废物利用了一下head节点中的data变量,将其含义变为目前链表长度,这样在判断时只需要判断head.data是否为0或者maxSize即可。

java链表栈的类定义如下:

class linkstack{
public int maxSize; public linkstack(int maxSize) {
this.maxSize = maxSize;
} public stackNodee head=new stackNodee(0,0);
public boolean isFull(){
if(head.data==maxSize){
return true;
}
return false;
}
public boolean isempty(){
if(head.data==0){
return true;
}
return false;
}
public void push(int value){
if(isFull()){
System.out.println("栈已满,无法加入");
return;
}
int n=head.data+1;
stackNodee temp=new stackNodee(n,value);
if(isempty()){
head.next=temp;
head.data++;
return;
}
temp.next=head.next;
head.next=temp;
head.data++;
}
public int pop(){
int value;
if(isempty()){
throw new RuntimeException("栈空,没有数据");
}else {
value=head.next.data;
head.next=head.next.next;
head.data--;
}
return value;
}
public void list(){
if(isempty()){
System.out.println("链表为空");
return;
}
stackNodee temp=head.next;
for (int i=1;i<=head.data;i++){
System.out.printf("stack[%d]=%d\n",i,temp.data);
temp=temp.next;
}
} }
class stackNodee{
public int no;
public int data;
public stackNodee next; public stackNodee(int no, int data) {
this.no = no;
this.data = data;
}
}

这次的实验让我灵活运用了链表和栈,对此两种数据结构都有了更进一步的理解。在书写代码的过程中,我个人认为数组的方式还是要比链表的方式简单很多,有序数组自带记录了索引和数据,以及可定义数组长度,我认为还是比链表方便很多。

12.java链表栈和数组栈的更多相关文章

  1. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  2. 栈的数组和链表实现(Java实现)

    我以前用JavaScript写过栈和队列,这里初学Java,于是想来实现栈,基于数组和链表. 下面上代码: import java.io.*; //用接口来存放需要的所有操作 interface st ...

  3. 栈的Java实现-分别使用数组和链表

    栈是非常重要的数据结构,栈具有后进先出的特点. 在JVM内部,每个线程维护一个栈,对于每个方法调用,入栈一个元素,成为栈帧,当方法执行完成后,对应的栈帧出栈. 栈帧中,也包含一个栈,称为操作数栈. 一 ...

  4. 剑指offer-第二章数据结构(数组,字符串,链表,树,栈与队列)及例题

    一.数组(最简单的数据结构) 定义:占据一块连续内存并按照顺序存储数据.创建时先指定大小,分配内存. 优点:时间效率高.实现简单的hash(下标为key,对应的数据为value) 缺点:空间效率差.如 ...

  5. 使用python实现数组、链表、队列、栈

    引言 什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中. 比如:列表,集合和字 ...

  6. java——数组栈 ArrayStack

    栈的应用: undo操作-编辑器 系统调用栈-操作系统 括号匹配-编译器 以下是动态数组实现的数组栈: 定义动态数组: package Date_pacage; public class Array& ...

  7. 【Java】 大话数据结构(6) 栈的顺序与链式存储

    本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所 ...

  8. 数据结构Java实现05----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  9. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  10. java数据结构与算法之栈(Stack)设计与实现

    本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...

随机推荐

  1. Python中的枚举类enum

    0. 本文来历 上一篇文章,我写了Pytest插件pytest-order指定用例顺序 我当时就比较好奇它的顺序和英文的对应关系,肯定是写死的,找了下就发现在源码sorter.py中定义了一个dict ...

  2. Vue30 过度与动画

    1 简介 Vue封装的过度与动画,插入.更新或者移除 DOM 时,在合适的时候给元素添加样式类名,达到应用过渡和动画效果. 2 vue内置的样式 Vue在元素显示与隐藏的过渡中,提供了 6 个 cla ...

  3. 3分钟教你安装 Compressor视频转码编辑工具 V4.6.3中文破解版 小白一看就会

    Comperssor 下载 下载直通车 立即下载 Mac App Store: https://apps.apple.com/cn/app/compressor/id424390742?ign-mpt ...

  4. Error: EPERM: operation not permitted, mkdir ‘C:\Program Files\nodejs‘TypeError: Cannot read proper

    出现问题: 问题如题,出现场景:vscode运行npm命令 解决办法: 有的友友说安装nodejs时用管理员身份安装,右键没找到最后删掉了此文件即可. 这个文件缓存了之前的配置与现在安装的nodejs ...

  5. element-UI el-table动态显示隐藏列造成固定一侧的列(fixed=“left/right“)错误显示

    问题原因:多个tabs共用一个实体,动态显示隐藏列 出现了固定在右侧的列(fixed="right")错位 [解决方案] 表格的重新布局,只要table数据发生变化的时候就重新渲染 ...

  6. try-catch易错分析

    /* * @author YAM */public class Test01 { public static void main(String[] args) { try { showExce(); ...

  7. 大曝光!从RabbitMQ平滑迁移至Kafka架构设计方案!

    历史原因,公司存在多个 MQ 同时使用的问题,我们中间件团队在去年下半年开始支持对 Kafka 和 Rabbit 能力的进行封装,初步能够完全支撑业务团队使用. 鉴于在之前已经基本完全实施 Kafka ...

  8. ctfshow_web入门 命令执行

    命令执行 刚刚开始学习命令执行,萌新一个 因为是学习嘛,所以东西写的杂乱了 web 29 error_reporting(0); if(isset($_GET['c'])){ $c = $_GET[' ...

  9. SQL语句中 left join 后用 on 还是 where,区别大了!

    前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两条. 后来发现 join on and 不会过滤结果记录条数,只会根据and后的 ...

  10. window 运行 jar包方式

    所有文件 1.将jar包指定为bat批处理文件,然后可以双击启动 新建start2.txt 编辑保存一下内容,修改start2.txt后缀为bat,点击运行(此方法当前命令窗口关闭后,程序也关闭) j ...