一、栈的介绍

任何数据结构都是一种规则

栈就是在最基础的结构——线性结构和链式结构上面定义规则形成的

如果对基本数据结构(线性表和链表)有疑问的同学可以看我之前的博客:https://www.cnblogs.com/yxm2020/p/12762888.html

规则如下:

限制链表或者线性表元素的插入和取出,只能在同一端进行操作,运行插入的一段称为栈顶(top),另一端为固定的一端,成为栈底。

图解:(入栈和出栈)

特点:

先入后出FILO(First in last out),最先放入栈的数据,只能最后才能出来,和队列完全相反

栈的应用场景:

保存运行过程中程序中的代码或者值,比如:

  • 子程序的调用
  • 处理递归的调用
  • 表达式的转换(中缀转后缀)
  • 二叉树的遍历
  • 图形的深度优先遍历

二、代码的实现思路

1、思路

  1. 确定一个结构存储数据,线性表或者链表
  2. 既然只能在栈顶操作,那么定义一栈顶标志(top)
  3. 最基本的两个方法,入栈和出栈
  4. 入栈后,在栈顶加入一个元素,top上移一个单元
  5. 出栈后,在栈顶删除一个元素,top下移一个单元

2、Java实现

  1. 用Java数组模拟栈
  2. java链表实现栈

三、Java数组模拟栈

public class ArrayStack<T> {
//栈顶标志
private int top;
//java数组
private T[] stack;
//最大长度
private int maxsize;
public ArrayStack(int maxsize,Class<T> type){
this.maxsize = maxsize;
this.top = -1;
stack = (T[]) Array.newInstance(type,maxsize);
}
//长度
public int size(){
return top+1;
}
//栈满
public boolean isFull(){
return top == maxsize-1;
}
//栈空
public boolean isEnpty(){
return top == -1;
}
//入栈
public void push(T t){
if(isFull()){
throw new RuntimeException("栈满");
}
top++;
stack[top] = t;
}
//出栈
public T pop(){
if(isEnpty()){
throw new RuntimeException("栈空");
}
T value = stack[top];
top--;
return value;
}
//遍历
public void show(){
if(isEnpty()){
System.out.println("栈空");
}
int temp = top;
while (temp != -1){
System.out.println(stack[temp]);
temp--;
}
}
}

四、Java链表实现栈

public class LinkedStack<T> {
//定义一个栈顶标志,带了个
private Node top;
private class Node{
private Node next;
private T t;
public Node(T t){
this.t = t;
}
}
//创建
public LinkedStack(){
top = new Node(null);
}
//栈空
public boolean isEnpty(){
if(top.next == null){
return true;
}
return false;
}
//入栈
public void push(T t){
Node newNode = new Node(t);
//从栈顶入
newNode.next = top.next;
top.next = newNode;
}
//出栈
public T pop(){
if(isEnpty()){
System.out.println("栈空");
return null;
}
T value = top.next.t;
top.next = top.next.next;
return value;
}
//show
public void show(){
Node temp = top;
if(temp.next == null){
System.out.println("栈空");
}
while (temp.next!=null){
temp = temp.next;
System.out.println(temp.t);
}
}
}

Java实现栈(链表和线性表两种方法实现)的更多相关文章

  1. Java构造和解析Json数据的两种方法详解二

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...

  2. Java构造和解析Json数据的两种方法详解二——org.json

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...

  3. Java构造和解析Json数据的两种方法详解一——json-lib

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...

  4. Java执行shell脚本并返回结果两种方法的完整代码

    Java执行shell脚本并返回结果两种方法的完整代码 简单的是直接传入String字符串,这种不能执行echo 或者需要调用其他进程的命令(比如调用postfix发送邮件命令就不起作用) 执行复杂的 ...

  5. DES加密 java与.net可以相互加密解密两种方法

    DES加密 java与.net可以相互加密解密两种方法 https://www.cnblogs.com/DrWang/archive/2011/03/30/2000124.html sun.misc. ...

  6. Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...

  7. 将引用了第三方jar包的Java项目打包成jar文件的两种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...

  8. 使用 Eclipse 可视化插件 windowbuilder 进行Java GUI开发(插件安装的两种方法)

    对于Java GUI开发 其实最方便的方法是用插件制作,当然先了解完代码原理是最好的. eclispe安装windowbuilder有两种方式,一种是离线安装,一种是在线安装. 一.第一种在线安装: ...

  9. Java中对List集合排序的两种方法

    第一种方法,就是list中对象实现Comparable接口,代码如下: public class Person implements Comparable<Person> { privat ...

随机推荐

  1. AJ学IOS(53)多线程网络之NSOperation简介

    AJ分享,必须精品 一:简单介绍 1:NSOperation的作⽤使用步骤: 配合使用NSOperation和NSOperationQueue也能实现多线程编程. NSOperation和NSOper ...

  2. vue2.x学习笔记(十九)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12631022.html. 程序化的事件侦听器 在前面的学习中,我们已经知道了[$emit]全局属性的用法,它可以被 ...

  3. 【题解】P2602 数字计数 - 数位dp

    P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数 \(a\) 和 \(b\) ,求在 \([a,b]\) 中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中 ...

  4. Mysql中的一些类型

    列类型--整数类型Tinyint:迷你整形 一个字节=8位 最大能表示的数值是0-255 实际区间 -128~127Smallint:小整形 两个字节 能表示0-65535Mediumint:中整型 ...

  5. Vue自定义指令 数据传递

    在项目开发过程中,难免会遇到各种功能需要使用Vue自定义指令--directive 去实现 .关于directive的使用方式这里就不做过多的介绍了,Vue官方文档中说的还是听明白的.今天讲讲在使用V ...

  6. 关于ubuntu安装vmware报错问题解决

    命令行中报错 首先报错内容为:(vmware-installer.py:3847): Gtk-WARNING **: 无法在模块路径中找到主题引擎:“murrine”, 以上的内容: sudo apt ...

  7. MAC地址欺骗(原理及实验)

    MAC地址欺骗 MAC地址欺骗(或MAC地址盗用)通常用于突破基于MAC地址的局域网访问控制,例如在交换机上限定只转发源MAC地址修改为某个存在于访问列表中的MAC地址即可突破该访问限制,而且这种修改 ...

  8. Spring5参考指南:组件扫描

    文章目录 组件扫描 @Component 元注解和组合注解 组件内部定义Bean元数据 为自动检测组件命名 为自动检测的组件提供作用域 生成候选组件的索引 组件扫描 上一篇文章我们讲到了annotat ...

  9. SpringBoot应用操作Rabbitmq(direct高级操作)

    一.首先声明完成任务架构,通过direct订阅/发布的模式进行生产消费. a.消息生产指定交换器和路由key b.消费者绑定交换器,路由key和队列的关系(集群监控收到的消息不重复) 二.实战演练 1 ...

  10. java之重载与重写

    重写(override) 重写是子类对父类的允许访问的方法的重新编写,方法名,返回值类型和形参列表都不能改变,唯一恩能够改变的是方法体. 重写的好处是可以根据子类的需要的行为来实现父类的方法. 重写方 ...