12.java链表栈和数组栈
栈是一个先入后出的有序列表,栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表,一端为变化的一端,称为栈顶,另一端是固定的,称为栈底。先入的元素在栈底,最后放入的元素在栈顶,删除时后放入的元素先删除,最先放入的元素最后删除。
老师在这里讲解的只有用数组模拟栈,书写类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链表栈和数组栈的更多相关文章
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
- 栈的数组和链表实现(Java实现)
我以前用JavaScript写过栈和队列,这里初学Java,于是想来实现栈,基于数组和链表. 下面上代码: import java.io.*; //用接口来存放需要的所有操作 interface st ...
- 栈的Java实现-分别使用数组和链表
栈是非常重要的数据结构,栈具有后进先出的特点. 在JVM内部,每个线程维护一个栈,对于每个方法调用,入栈一个元素,成为栈帧,当方法执行完成后,对应的栈帧出栈. 栈帧中,也包含一个栈,称为操作数栈. 一 ...
- 剑指offer-第二章数据结构(数组,字符串,链表,树,栈与队列)及例题
一.数组(最简单的数据结构) 定义:占据一块连续内存并按照顺序存储数据.创建时先指定大小,分配内存. 优点:时间效率高.实现简单的hash(下标为key,对应的数据为value) 缺点:空间效率差.如 ...
- 使用python实现数组、链表、队列、栈
引言 什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中. 比如:列表,集合和字 ...
- java——数组栈 ArrayStack
栈的应用: undo操作-编辑器 系统调用栈-操作系统 括号匹配-编译器 以下是动态数组实现的数组栈: 定义动态数组: package Date_pacage; public class Array& ...
- 【Java】 大话数据结构(6) 栈的顺序与链式存储
本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所 ...
- 数据结构Java实现05----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- java数据结构与算法之栈(Stack)设计与实现
本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...
随机推荐
- Selenium中对于颜色的处理及拓展
Selenium中对于颜色的处理及拓展 获取百度一下按钮的背景色 from selenium import webdriver from time import sleep driver = webd ...
- excel空格处理
private String StringTrim(String str){ return str.replaceAll("[\\s\\u00A0]+","") ...
- .Net 和 .Net Core 集成Swagger 以及配合JWT身份验证
Swagger介绍 简单来说swagger是一款WebAPI的接口管理帮助文档,并且可以直接进行接口测试 我们来看一下官网介绍 https://swagger.io Swagger is a powe ...
- 【DS】2.1
线性表:c++各种基础操作里面,有&没&避免错的代码额~ #include <stdio.h> void test(int &x){//没有&就没有带回主函 ...
- 注释、input()、运算符、组织结构(顺序、选择、循环)
注释 单行注释 # 多行注释 将三对引号之间的为多行注释 ''' ''' 中文编码的声明注释 #coding:gbk input()函数 接受来自用户的输入 返回值是str 值的存储 使用=对输入的值 ...
- 配置文件、RDB、Jedis
配置文件 # Note on units: when memory size is needed, it is possible to specify # it in the usual form o ...
- bat脚本登陆ftp服务器
用bat脚本登录ftp服务器,下载指定文件. 第一次脚本,有问题,你发现了么? 由于每个">>"重定向符号之前都习惯用空格(python style),导致写道ftp. ...
- Docker安装部署Mysql8(以作数据持久化)
1.创建容器并进行持久化处理 #拉取镜像 docker pull mysql:8.0.20 #启动镜像,用于拷贝配置文件到宿主机 docker run -p 3306:3306 --name mysq ...
- 优化 Win11 资源管理器打开文件夹速度
打开"高级系统设置",点击"性能"设置,性能选项中勾选如上图选中的项,可以一定程度上提升 Win11 资源管理器打开文件夹的速度: "窗口内动画控件和 ...
- 一次k8s docker下.net程序的异常行为dump诊断
背景 昨天,一位朋友找到我寻求帮助.他的项目需要调用一个第三方项目的webAPI.这个webAPI本身可从header, query string中取相关信息,但同事发现他在调用时,无法按期望的那样从 ...