数据结构——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.什么是数据结构?数据结构有哪些? 数据结构是指数据在内存中存放的机制. 不同的数据结构在数据的查询,增删该的情况下性能是不一样的. 数据结构是可以模拟业务场景. 常见的数据结构有:栈,队列 ...
随机推荐
- What are the benefits to using anonymous functions instead of named functions for callbacks and parameters in JavaScript event code?
What are the benefits to using anonymous functions instead of named functions for callbacks and par ...
- Linux中touch命令使用(创建文件)
touch命令有两个功能: 1.用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来: 2.用来创建新的空文件. 语法 touch(选项)(参数) 选项 -a:或 ...
- hibernate的各种查询
Hibernate Query Language(HQL)Criteria QueryNative SQL下面对其分别进行解释select子句:有时并不需要取得对象的所有属性,这时可以使用select ...
- angular绑定数据
Angular 中使用{{}}绑定业务逻辑里面定义的数据 <h1> Welcome to {{ title }}! /*引入title*/ </h1> export class ...
- StringBuider类
特点: 线程不安全的可变字符序列 ; 线程不安全对应的效率高 ; 用法同StringBuffer一致
- svn add 命令 递归目录下所有文件
svn add 命令 递归目录下所有文件 摘自:https://blog.csdn.net/yefl007/article/details/46506281 即使被忽略了也可以使用此命令. svn a ...
- ClientDataSet中修改,删除,添加数据和Delta属性
ClientDataSet中使用Post提交变更的数据时,实际上并没有更新到后端数据库中,而是提交到了由DataSnap管理的数据缓冲区中.当使用了ClientDataSet.ApplyUpDates ...
- 【Leetcode_easy】637. Average of Levels in Binary Tree
problem 637. Average of Levels in Binary Tree 参考 1. Leetcode_easy_637. Average of Levels in Binary T ...
- js 如何让两个等长的数组产生键值对关系
问题的准确描述:js 将两个长度一样的一维数组 合成一个一维数组,A为键值,B为key值 js 将两个长度一样的一维数组 合成一个一维数组,A为键值,B为key值 如 var arr1=['a','b ...
- iOS-图形绘制(全)
画阴影: CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(contex ...