栈:LIFO(后进先出)

队列:FIFO(先进先出)

1、栈:LIFO(后进先出)

1.1、栈的顺序存储结构实现:

/**
* 基于数组实现的顺序栈
* @param <E>
*/
public class Stack<E> {
private Object[] data = null;
private int maxSize=0; //栈容量
private int top =-1; //栈顶指针 /**
* 构造函数:根据给定的size初始化栈
*/
Stack(){
this(10); //默认栈大小为10
} Stack(int initialSize){
if(initialSize >=0){
this.maxSize = initialSize;
data = new Object[initialSize];
top = -1;
}else{
throw new RuntimeException("初始化大小不能小于0:" + initialSize);
}
} //判空
public boolean empty(){
return top==-1 ? true : false;
} //进栈,第一个元素top=0;
public boolean push(E e){
if(top == maxSize -1){
throw new RuntimeException("栈已满,无法将元素入栈!");
}else{
data[++top]=e;
return true;
}
} //查看栈顶元素但不移除
public E peek(){
if(top == -1){
throw new RuntimeException("栈为空!");
}else{
return (E)data[top];
}
} //弹出栈顶元素
public E pop(){
if(top == -1){
throw new RuntimeException("栈为空!");
}else{
return (E)data[top--];
}
} //返回对象在堆栈中的位置,以 1 为基数
public int search(E e){
int i=top;
while(top != -1){
if(peek() != e){
top --;
}else{
break;
}
}
int result = top+1;
top = i;
return result;
}
}

1.2、栈的链式存储结构实现:

public class LinkStack<E> {
//链栈的节点
private class Node<E>{
E e;
Node<E> next; public Node(){}
public Node(E e, Node next){
this.e = e;
this.next = next;
}
} private Node<E> top; //栈顶元素
private int size; //当前栈大小 public LinkStack(){
top = null;
} //当前栈大小
public int length(){
return size;
} //判空
public boolean empty(){
return size==0;
} //入栈:让top指向新创建的元素,新元素的next引用指向原来的栈顶元素
public boolean push(E e){
top = new Node(e,top);
size ++;
return true;
} //查看栈顶元素但不删除
public Node<E> peek(){
if(empty()){
throw new RuntimeException("空栈异常!");
}else{
return top;
}
} //出栈
public Node<E> pop(){
if(empty()){
throw new RuntimeException("空栈异常!");
}else{
Node<E> value = top; //得到栈顶元素
top = top.next; //让top引用指向原栈顶元素的下一个元素
value.next = null; //释放原栈顶元素的next引用
size --;
return value;
}
}
}

 1.3、基于LinkedList实现的栈结构:

import java.util.LinkedList;

/**
* 基于LinkedList实现栈
* 在LinkedList实力中只选择部分基于栈实现的接口
*/
public class StackList<E> {
private LinkedList<E> ll = new LinkedList<E>(); //入栈
public void push(E e){
ll.addFirst(e);
} //查看栈顶元素但不移除
public E peek(){
return ll.getFirst();
} //出栈
public E pop(){
return ll.removeFirst();
} //判空
public boolean empty(){
return ll.isEmpty();
} //打印栈元素
public String toString(){
return ll.toString();
}
}

2、队列:FIFO(先进先出)

2.1 队列的顺序存储结构实现

public class Queue<E> {
private Object[] data=null;
private int maxSize; //队列容量
private int front; //队列头,允许删除
private int rear; //队列尾,允许插入 //构造函数
public Queue(){
this(10);
} public Queue(int initialSize){
if(initialSize >=0){
this.maxSize = initialSize;
data = new Object[initialSize];
front = rear =0;
}else{
throw new RuntimeException("初始化大小不能小于0:" + initialSize);
}
} //判空
public boolean empty(){
return rear==front?true:false;
} //插入
public boolean add(E e){
if(rear== maxSize){
throw new RuntimeException("队列已满,无法插入新的元素!");
}else{
data[rear++]=e;
return true;
}
} //返回队首元素,但不删除
public E peek(){
if(empty()){
throw new RuntimeException("空队列异常!");
}else{
return (E) data[front];
}
} //出队
public E poll(){
if(empty()){
throw new RuntimeException("空队列异常!");
}else{
E value = (E) data[front]; //保留队列的front端的元素的值
data[front++] = null; //释放队列的front端的元素
return value;
}
} //队列长度
public int length(){
return rear-front;
}
}

2.2、循环队列的顺序存储结构实现

import java.util.Arrays;

public class LoopQueue<E> {
public Object[] data = null;
private int maxSize; // 队列容量
private int rear;// 队列尾,允许插入
private int front;// 队列头,允许删除
private int size=0; //队列当前长度 public LoopQueue() {
this(10);
} public LoopQueue(int initialSize) {
if (initialSize >= 0) {
this.maxSize = initialSize;
data = new Object[initialSize];
front = rear = 0;
} else {
throw new RuntimeException("初始化大小不能小于0:" + initialSize);
}
} // 判空
public boolean empty() {
return size == 0;
} // 插入
public boolean add(E e) {
if (size == maxSize) {
throw new RuntimeException("队列已满,无法插入新的元素!");
} else {
data[rear] = e;
rear = (rear + 1)%maxSize;
size ++;
return true;
}
} // 返回队首元素,但不删除
public E peek() {
if (empty()) {
throw new RuntimeException("空队列异常!");
} else {
return (E) data[front];
}
} // 出队
public E poll() {
if (empty()) {
throw new RuntimeException("空队列异常!");
} else {
E value = (E) data[front]; // 保留队列的front端的元素的值
data[front] = null; // 释放队列的front端的元素
front = (front+1)%maxSize; //队首指针加1
size--;
return value;
}
} // 队列长度
public int length() {
return size;
} //清空循环队列
public void clear(){
Arrays.fill(data, null);
size = 0;
front = 0;
rear = 0;
}
}

2.3、队列的链式存储结构实现

public class LinkQueue<E> {
// 链栈的节点
private class Node<E> {
E e;
Node<E> next; public Node() {
} public Node(E e, Node next) {
this.e = e;
this.next = next;
}
} private Node front;// 队列头,允许删除
private Node rear;// 队列尾,允许插入
private int size; //队列当前长度 public LinkQueue() {
front = null;
rear = null;
} //判空
public boolean empty(){
return size==0;
} //插入
public boolean add(E e){
if(empty()){ //如果队列为空
front = new Node(e,null);//只有一个节点,front、rear都指向该节点
rear = front;
}else{
Node<E> newNode = new Node<E>(e, null);
rear.next = newNode; //让尾节点的next指向新增的节点
rear = newNode; //以新节点作为新的尾节点
}
size ++;
return true;
} //返回队首元素,但不删除
public Node<E> peek(){
if(empty()){
throw new RuntimeException("空队列异常!");
}else{
return front;
}
} //出队
public Node<E> poll(){
if(empty()){
throw new RuntimeException("空队列异常!");
}else{
Node<E> value = front; //得到队列头元素
front = front.next;//让front引用指向原队列头元素的下一个元素
value.next = null; //释放原队列头元素的next引用
size --;
return value;
}
} //队列长度
public int length(){
return size;
}
}

2.4、基于LinkedList实现队列结构

/**
* 使用java.util.Queue接口,其底层关联到一个LinkedList(双端队列)实例.
*/
import java.util.LinkedList;
import java.util.Queue; public class QueueList<E> {
private Queue<E> queue = new LinkedList<E>(); // 将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,
//如果当前没有可用的空间,则抛出 IllegalStateException。
public boolean add(E e){
return queue.add(e);
} //获取,但是不移除此队列的头。
public E element(){
return queue.element();
} //将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,
//此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。
public boolean offer(E e){
return queue.offer(e);
} //获取但不移除此队列的头;如果此队列为空,则返回 null
public E peek(){
return queue.peek();
} //获取并移除此队列的头,如果此队列为空,则返回 null
public E poll(){
return queue.poll();
} //获取并移除此队列的头
public E remove(){
return queue.remove();
} //判空
public boolean empty() {
return queue.isEmpty();
}
}

Java三种方式实现栈和队列的更多相关文章

  1. Java 三种方式实现接口校验

    方法一:AOP 代码如下定义一个权限注解 package com.thinkgem.jeesite.common.annotation; import java.lang.annotation.Ele ...

  2. 执行ANT JAVA三种方式

    1. 命令行 <target name="reporttoexcel" depends="report"> <exec executable= ...

  3. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  4. java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))

    1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...

  5. Struts2-从值栈获取list集合数据(三种方式)

    创建User封装数据类 public class User { private String username; private String password; public String getP ...

  6. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  7. Java设置session超时(失效)的三种方式

    1. 在web容器中设置(此处以tomcat为例) 在tomcat-6.0\conf\web.xml中设置,以下是tomcat 6.0中的默认配置: <!-- ================= ...

  8. Java中 实现多线程成的三种方式(继承,实现,匿名内部类)

    ---------------------------------------------------------------------------------------------------- ...

  9. java中遍历集合的三种方式

    第一种遍历集合的方式:将集合变为数组 package com.lw.List; import java.util.ArrayList; import java.util.List; import ja ...

随机推荐

  1. SpringBoot vue

    springboot 整合vue就行前后端完全分离,监听器,过滤器,拦截器 https://github.com/ninuxGithub/spring-boot-vue-separateA blog ...

  2. Idea 的两个快捷键不能用的解决过程

    早上来重启电脑后,Idea 的Ctrl+Alt+V还能用,但中间不知道那个时间点开始就不好用了(中间有启动有道词典查词) 度娘上没找到答案,hot key这种软件被win10提示有病毒,没敢用 然后尝 ...

  3. Mabits简单应用 2017.8.3

    http://www.cnblogs.com/wushiqi54719880/archive/2011/07/26/2117601.html

  4. 关于 行高lineheight的概念及与Vertical-align、内容框、基线等的关系

    1.关于行高 行高:顾名思意指一行文字的高度.具体来说是指两行文字间基线之间的距离,他也是底线和顶线之间距离   (1)内容区

  5. python - hash类型操作

    Redis在内存中存储hash类型是以name对应一个字典形式存储的 常用操作 在name对应的hash中获取根据key获取valuehget(name,key) 在name 对应的hash 中设备键 ...

  6. 一次完整的HTTP网络请求过程详解

    0.  前言 从我们在浏览器的地址栏输入http://blog.csdn.net/seu_calvin后回车,到我们看到该博客的主页,这中间经历了什么呢?简单地回答这个问题,大概是经历了域名解析.TC ...

  7. Inception体验之安装

    Inception介绍 MySQL Inception是数据库管理员的工具.它允许DBA构建好的SQL语句,在只读数据集上测试它们,并最终针对生产数据库运行这些SQL语句,并且能够在SQL语句出于某种 ...

  8. BigInteger类及方法应用

    注:以下内容来自传智播客(itcast)老师授课 BigInteger 可以让超过Integer范围内的数据进行运算 构造方法 public BigInteger(String val) 成员方法 p ...

  9. bzoj5153&uoj348 【WC2018】州区划分

    五十分就是裸的O(3^n)子集dp. $$f[S]*{w[S]^{p}}=\sum_{T \in S}{f[T]*{w[S-T]^{p}}}$$ 然后我们考虑优化这个dp,我们发现这是子集卷积的形式, ...

  10. validatebox相关验证

    $(document).ready( function(){ $.extend($.fn.validatebox.defaults.rules, { minLength: { validator: f ...