定义:

栈是一种先进后出的数据结构,我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的栈称为空栈

栈的java代码实现:

基于数组:

 import org.junit.jupiter.api.Test;

 /**
* 用数组实现栈
* @author wydream
*
*/ public class ArrayStack<T> { private T data[];
private int maxSize;
private int top; //初始化栈
public ArrayStack(int maxSize) {
this.maxSize=maxSize;
data=(T[])new Object[maxSize];
this.top=-1;
} //判断栈是否为空
public boolean isEmpty() {
return (top==-1);
} //判断栈是否已经满了
public boolean isFull() {
return (top==maxSize-1);
} //压栈
public boolean push(T value) {
if(isFull()) {
return false;
}
top++;
data[top]=value;
return true;
} //取出栈顶元素
public T pop() {
if(isEmpty()) {
return null;
}
T tmp=data[top];
data[top]=null;
top--;
return tmp;
} //============测试代码============
public static void main(String[] args) {
ArrayStack<String> as=new ArrayStack<String>(4);
as.push("anhui");
as.push("shanghai");
as.push("beijing");
as.push("nanj");
//测试栈已经满了的情况
System.out.println(as.push("aa"));
for(int i=0;i<4;i++) {
System.out.println(as.pop());
}
} }

基于链表:

 import org.junit.jupiter.api.Test;

 /**
* 基于链表实现的栈
* @author wydream
*
*/ public class NodeStack<T> { private Node<T> top=null;//栈顶
public NodeStack() {
this.top=null;
} //判断栈是否为空
public boolean isEmpty() {
if(top!=null) {
return false;
}
return true;
} //压栈
public boolean push(T value) {
Node<T> node=new Node<T>(value);
node.setNext(top);
top=node;
return true;
} //出栈
public T pop() {
if(top==null) {
return null;
}
T tmp=top.data;
top=top.getNext();
return tmp;
}
//取出栈顶的值
public T peek() {
if(isEmpty()) {
return null;
}
return top.data;
} class Node<T>{
private T data;//数据
private Node<T> next;//指向下一个节点的指针
//初始化链表
public Node(T data) {
this.data=data;
}
//获取下一个节点
public Node<T> getNext(){
return this.next;
}
//设置下一个节点
public void setNext(Node<T> n) {
this.next=n;
}
//获取节点数据
public T getData() {
return this.data;
}
//设置节点数据
public void setData(T d) {
this.data=d;
} } public static void main(String[] args) { NodeStack<String> ns=new NodeStack<String>(); //测试是否为空
System.out.println("=======是否为空======");
System.out.println(ns.isEmpty());
System.out.println("=============");
//压栈测试
System.out.println("=======压栈======");
ns.push("北京");
ns.push("上海");
ns.push("深证");
ns.push("广州");
//是否为空
System.out.println("=======是否为空======");
System.out.println(ns.isEmpty());
System.out.println("============="); System.out.println("=======出栈=======");
//出栈
System.out.println(ns.pop());
System.out.println(ns.pop());
System.out.println(ns.pop());
System.out.println(ns.pop());
System.out.println(ns.pop()); //是否为空
System.out.println("=======是否为空======");
System.out.println(ns.isEmpty());
System.out.println("============="); }
}

两栈共享空间:

栈有个缺陷,必须事先确定数组的大小,这样如果栈满了的话,想在存储元素就必须通过编程手段来扩充数组的容量,这样就很麻烦。于是我们就设计一个数组,里面存放着两个栈,共享这一个数组空间,这样就可以充分利用空间。数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的0下标,另一个栈的栈为数组的长度n-1处

代码实现:

 import javax.crypto.Mac;

 /**
* 两栈共享空间
* @author wydream
*
*/ public class DoubleStatk { private final static int MAXSIZE=20;
private int[] stackElem;
private int top1; //将top1设置为指向栈1栈顶元素的存储位置即数组下标0
private int top2; //将top2设置为指向栈2栈顶元素的存储位置即数组下标n-1 public DoubleStatk() {
top1=-1;
top2=MAXSIZE;
stackElem=new int[MAXSIZE];
} //是否是空栈
public boolean isEmptyStack() {
if(top1==-1&&top2==MAXSIZE) {
return true;
}
return false;
} //清空栈
public void clearStack() {
top1=-1;
top2=MAXSIZE;
} //栈的长度
public int lengthStak() {
return (top1+1)+(MAXSIZE-top2);
} //获取top1的元素
public int getTop1Elem() {
if(top1==-1) {
return -1;
}
return stackElem[top1];
} //获取top2的元素
public int getTop2Elem() {
if(top2==MAXSIZE) {
return -1;
}
return stackElem[top2];
} //压栈
public void stackPush(int stackNumber,int e) {
//如果栈已经满了
if(top1+1==top2) {
System.out.println("栈已满");
return;
}
if(stackNumber==1) {
top1+=1;
stackElem[top1]=e;
return;
}
if(stackNumber==2) {
top2-=1;
stackElem[top2]=e;
return;
} } //出栈
public int stackPop(int stackNumber) {
int rs;
if(isEmptyStack()) {
System.out.println("栈为空");
return -1;
}
if(stackNumber==1) {
rs= stackElem[top1];
top1--;
}else if(stackNumber==2) {
rs=stackElem[top2];
top2++;
}else {
System.out.println("输入数据有误");
return -1;
}
return rs;
} public void stackTraverse() {
System.out.println("此时,栈中的元素为:");
int i=0;
while(i<=top1) {
System.out.println(stackElem[i++]+" ");
}
i=top2;
while(i<MAXSIZE) {
System.out.println(stackElem[i++]+" ");
}
System.out.println();
} public static void main(String[] args) {
DoubleStatk seqStack=new DoubleStatk(); //1压栈
for(int j=1;j<=5;j++) {
seqStack.stackPush(1,j);
}
//2压栈
for(int i=MAXSIZE;i>=MAXSIZE-2;i--) {
seqStack.stackPush(2, i);
}
//输出
seqStack.stackTraverse();
System.out.println("栈的长度为:"+seqStack.lengthStak()); seqStack.stackPop(2);
seqStack.stackTraverse();
System.out.println("栈1的栈顶元素为: " + seqStack.getTop1Elem());
System.out.println("栈2的栈顶元素为: " + seqStack.getTop2Elem());
System.out.println("栈的长度为: " + seqStack.lengthStak()); for (int i = 6; i <= MAXSIZE-2; i++) {
seqStack.stackPush(1,i);
}
seqStack.stackTraverse();
System.out.println("栈1的栈顶元素为: " + seqStack.getTop1Elem());
System.out.println("栈2的栈顶元素为: " + seqStack.getTop2Elem());
System.out.println("栈顶元素为: " + seqStack.getTop2Elem());
System.out.println("栈的长度为: " + seqStack.lengthStak()); System.out.println("栈是否为空: " + seqStack.isEmptyStack());
seqStack.clearStack();
System.out.println("栈是否为空: " + seqStack.isEmptyStack());
} }

算法——Java实现栈的更多相关文章

  1. 基于FP-Tree的关联规则FP-Growth推荐算法Java实现

    基于FP-Tree的关联规则FP-Growth推荐算法Java实现 package edu.test.ch8; import java.util.ArrayList; import java.util ...

  2. Java 技术栈

    JAVA是一个面向对象的编程语言,由SUN公司的程序员所开发.它不仅吸收了C++的各种优点,而且还撇弃了C++中难以理解的概念,如多继承.指针等:因此JAVA语言具有功能强大且简单易用两个特征, JA ...

  3. Java全栈工程师知识体系介绍

    Java全栈工程师,是指掌握多种技能,并能利用多种技能独立完成产品的人,也叫全端工程师(同时具备前端和后台能力),英文Full Stack developer. 那么想要成为一名合格的Java全栈工程 ...

  4. java数据结构——栈(Stack)

    学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...

  5. Java全栈学习路线、学习资源和面试题一条龙

    肝了一个月,终于把Java学习路线.面试题资源和电子书资源都整理好了. Java 从基础到微服务的学习路线,其中还包括科班知识.学习建议.后续的学习引导和相应的学习资源(视频.书籍.网站),还整理了J ...

  6. Java 技术栈中间件优雅停机方案设计与实现全景图

    欢迎关注公众号:bin的技术小屋,阅读公众号原文 本系列 Netty 源码解析文章基于 4.1.56.Final 版本 本文概要 在上篇文章 我为 Netty 贡献源码 | 且看 Netty 如何应对 ...

  7. 归并排序算法 java 实现

    归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...

  8. 快速排序算法 java 实现

    快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...

  9. 堆排序算法 java 实现

    堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...

随机推荐

  1. MD5中使用16进制

    MD5中使用16进制消息摘要 分类: java_secruity2012-12-28 13:11 719人阅读 评论(0) 收藏 举报 消息摘要 由于数据在计算机中的表示,最终以二进制的形式存在,所以 ...

  2. AJ学IOS 之UIDynamic重力、弹性碰撞吸附等现象

    AJ分享,必须精品 一:效果 重力和碰撞 吸附现象 二:简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真 ...

  3. 【Java】Junit单元测试

    什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证. 对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Ja ...

  4. Nginx+uWSGI+Python+Django构建必应高清壁纸站

    写在前面 做这个网站的初衷是因为,每次打开必应搜索搜东西的时候都会被上面的背景图片吸引,我想必应的壁纸应该是经过专业人员精选出来的,我甚至会翻看以前的历史图片,唯一美中不足的是必应的首页只能查看最多7 ...

  5. python圆周率计算小程序(非常慢)

    源码: from math import fabs #导入数学模块 from time import perf_counter #导入时间模块 from numba import jit @jit d ...

  6. mysql数据库深入学习

    mysql 数据库 一.数据库介绍 1.关系型数据库的特点 ​ 二维表 典型产品Oracle传统企业,MySQL是互联网企业 数据存取是通过SQL 最大特点,数据安全性方面强(ACID) 2.NoSQ ...

  7. 吊打面试官系列:Redis 性能优化的 13 条军规大全

    1.缩短键值对的存储长度 键值对的长度是和性能成反比的,比如我们来做一组写入数据的性能测试,执行结果如下: 从以上数据可以看出,在 key 不变的情况下,value 值越大操作效率越慢,因为 Redi ...

  8. sftp的用法

    linux sftp远程连接命令 sftp -oPort=60001 root@192.168.0.254 使用-o选项来指定端口号. -oPort=远程端口号 sftp> get /var/w ...

  9. ESI web学习记录

    Ezbypass 解出 放在php新特性的文章最后了,利用json反序列化脚本绕过disable_functions来get flag Ezupload 没解出 登陆页面查看源代码发现,备份文件泄露. ...

  10. Linux系统防火墙相关操作

    服务器重启后防火墙会自动开启,需要把防火墙关闭 以下为对防火墙进行的相关操作 查看防火墙状态 systemctl status firewalld service iptables status 暂时 ...