数据结构——java实现栈
栈
定义:
栈是一种先进后出的数据结构,我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的栈称为空栈
栈的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实现栈的更多相关文章
- 数据结构Java实现05----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- Java数据结构和算法 - 栈和队列
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
- 数据结构Java实现03----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- Java虚拟机栈和本地方法栈
Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java ...
- 用Java实现栈结构
栈是一种先进后出的数据结构,出栈入栈都是操作的栈顶元素,下面是利用Java语言实现的一个简单的栈结构 class MyStack{ private int size;//栈大小 private Obj ...
- Java 技术栈
JAVA是一个面向对象的编程语言,由SUN公司的程序员所开发.它不仅吸收了C++的各种优点,而且还撇弃了C++中难以理解的概念,如多继承.指针等:因此JAVA语言具有功能强大且简单易用两个特征, JA ...
- Java全栈工程师知识体系介绍
Java全栈工程师,是指掌握多种技能,并能利用多种技能独立完成产品的人,也叫全端工程师(同时具备前端和后台能力),英文Full Stack developer. 那么想要成为一名合格的Java全栈工程 ...
- 2019 Java 全栈工程师进阶路线图,一定要收藏
技术更新日新月异,对于初入职场的同学来说,经常会困惑该往那个方向发展,这一点松哥是深有体会的. 我刚开始学习 Java 那会,最大的问题就是不知道该学什么,以及学习的顺序,我相信这也是很多初学者经常面 ...
- 数据结构(java)
数据结构1.什么是数据结构?数据结构有哪些? 数据结构是指数据在内存中存放的机制. 不同的数据结构在数据的查询,增删该的情况下性能是不一样的. 数据结构是可以模拟业务场景. 常见的数据结构有:栈,队列 ...
随机推荐
- java一周学习回顾
快速阅读 本周在学习java过程中主要是快马观花,对java的常用框架进行相关配置 ,进行简单的调用 .包括kafka,dubbo ,zookeeper.centos配置java环境.如何打war ...
- js type
js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型. new Object() functionundefined ...
- REST和SOAP的区别
转自:https://www.cnblogs.com/MissQing/p/7240146.html REST似乎在一夜间兴起了,这可能引起一些争议,反对者可以说REST是WEB诞生之始甚而是HTTP ...
- pecl和pear 的区别和联系
Pear:是PHP的扩展代码包,所有的扩展均以PHP代码的形式出现,功能强大,安装简单,甚至可以改改就用.使用的时候,要在代码中进行Include才能够使用. Pecl:是PHP的标准扩展,可以补充实 ...
- pom.xml中properties作用
可以在properties下声明相应的版本信息,然后在dependency下引用的时候用${spring-version}就可以引入该版本jar包了 <properties> <sp ...
- jquery页面滚动到指定id
//jquery页面滚动到指定id $body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html ...
- 一个漂亮的输出MySql数据库表结构的PHP页面
经常为了方便和直观,我们会首先直接在数据库中设计出表,但是接下来又要将表的结构和设计编写在设计文档中,以便编码的时候可以直观的查询,一旦数据库表非常多,字段非常多的时候,这无疑是件非常郁闷的工作. 这 ...
- mysql排序自段为字符串类型问题解决
677 000.000.000.000 2018-01-09 22:20:58 编辑 删除 锁定 199 666/777/888套餐标配 000.000.000.000 2018-01 ...
- Kafka Connect Architecture
Kafka Connect's goal of copying data between systems has been tackled by a variety of frameworks, ma ...
- FastCGI模式下安装Xcache
PHP执行的时候,会被编译成opcode,然后 zend引擎会执行opcode.也就是说,如果你两次执行同一个php程序,每次执行,他都要把php代码编译成opcodexcache的意义在于,当你第一 ...