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

老师在这里讲解的只有用数组模拟栈,书写类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. 一把梭:REST API 全用 POST(转载)

    一把梭:REST API 全用 POST(转载) 原文链接: https://coolshell.cn/articles/22173.html 写这篇文章的原因主要还是因为V2EX上的这个贴子,这个贴 ...

  2. java执行js脚本

    @Test public void aa() throws NoSuchMethodException { String regular = "function regular(args1) ...

  3. spring-security 解决

    引入依赖 <dependency> <groupId>org.springframework.security</groupId> <artifactId&g ...

  4. 【一句话】Java8后abstract class和interface的区别

    首先一句话: Java8后(1)interface支持default和static方法有实现,abstract class依然是抽象方法和非抽象方法,(2)可同时实现多个interface,(3)但成 ...

  5. 一次代码重构 JavaScript 图连通性判定

    简介 说重构其实就是整理了代码,第一次自己手写写的很丑,然后看了书上写的,虽然和书上的思路不同但是整理后几乎一样漂亮 效果 整体代码如下 class Node { AdjNodes = new Set ...

  6. Html5 canvas创意特效合集

    Canvas就像一块画布,我们可以通过调用脚本在Canvas上绘制任意形状,甚至是制作动画.本文就是收集了很多非常富有创意的一些canvas动画特效例子,这些例子都非常适合大家学习.更多源码可在在这里 ...

  7. Golang HTTP编程及源码解析

    1.网络基础 基本TCP客户-服务器程序Socket编程流程如如下图所示. TCP服务器绑定到特定端口并阻塞监听客户端端连接, TCP客户端则通过IP+端口向服务器发起请求,客户-服务器建立连接之后就 ...

  8. JZOJ 3213. 【SDOI2013】直径

    题目 思路 树的直径很好求,两遍 \(dfs\),记下两个端点 然后很显然所有直径经过的边必然在我们求出的这条直线上 那么我们只要判断一下一条直径上的边是不是答案 假设当前边为 \(i\) 那么把 \ ...

  9. 黑群晖NAS、windows server服务器内网穿透

    推荐一个套件: http://nas.8x6x.com/ 远程速度大概3m每秒,一月10元,很好用. 怎么使用里面有教程,这里暂时不更新. 2022.10.16更新 目前已经卸载了群辉系统,换了win ...

  10. 推荐系统[八]算法实践总结V2:排序学习框架(特征提取标签获取方式)以及京东推荐算法精排技术实战

    0.前言 「排序学习(Learning to Rank,LTR)」,也称「机器排序学习(Machine-learned Ranking,MLR)」 ,就是使用机器学习的技术解决排序问题.自从机器学习的 ...