栈: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. is not eligible for getting processed by all BeanPostProcessors

    BeanPostProcessor是控制Bean初始化开始和初始化结束的接口.换句话说实现BeanPostProcessor的bean会在其他bean初始化之前完成,BeanPostProcessor ...

  2. zookeeper 配置文件conf目录下 zoo文件 配置详解

    clientPort:客户端尝试连接server的端口号 (对外服务端口) 通常为2181 dataDir:存放快照文件snapshot的目录.(储存数据的目录) dataLogDir:事务日志存放位 ...

  3. elementui+vuejs如何添加表格操作按钮

    <el-table :data="tableData" stripe border style="width:100%" highlight-curren ...

  4. jQuery学习之旅 Item3 属性操作与样式操作

    本节将Dom元素的操作:属性操作.样式操作.设置和获取HTML,文本和值.Css-Dom操作. 1.属性操作 <input type="text" name="us ...

  5. 11. 将博客部署到tomcat上

    springboot项目既可以以jar运行,也可以做成war包放到服务器上,因为我的博客项目涉及到文件上传,所以按照jar的方式就不可行,需要部署到tomcat上,具体做法如下:1. 修改pom.xm ...

  6. TestNG深入理解

    以下内容引自: http://blog.csdn.net/wanglha/article/details/42004695 TestNG深入理解 转载 2014年12月18日 13:56:11 参考文 ...

  7. 从一个例子了解window.onload、$(function(){})、$(window).load(function(){})的加载顺序

    最近遇到一个轮播需求: 1. ajax请求服务器,返回json,判断json数据里每一项中isFix属性是0还是1,0表示不轮播,1表示需要轮播. 2. 当isFix属性为0的时候,表示该图片不轮播, ...

  8. bzoj3594 方伯伯的玉米田 树状数组优化dp

    f[i][j]表示到第i位,使用了j次机会的最长不下降子序列长度 转移:f[i][j]=max(f[x][y])+1; x<i; y<=j; a[x]+y<=a[i]+j; 所以根据 ...

  9. BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包

    BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包 题意: 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s i的价值 ...

  10. (4)STM32使用HAL库实现串口通讯——理论讲解

    一.查询模式 1. 二.中断模式 1.中断接收. 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandle ...