Java模拟栈和队列数据结构的基本示例讲解

栈和队列:
一般是作为程序员的工具,用于辅助构思算法,生命周期较短,运行时才被创建;
访问受限,在特定时刻,只有一个数据可被读取或删除;
是一种抽象的结构,内部的实现机制,对用户不可见,比如用数组、链表来实现栈。

模拟栈结构
同时,只允许一个数据被访问,后进先出
对于入栈和出栈的时间复杂度都为O(1),即不依赖栈内数据项的个数,操作比较快
例,使用数组作为栈的存储结构

public class StackS<T> {
  private int max;
  private T[] ary;
  private int top;  //指针,指向栈顶元素的下标 

  public StackS(int size) {
    this.max = size;
    ary = (T[]) new Object[max];
    top = -1;
  } 

  // 入栈
  public void push(T data) {
    if (!isFull())
      ary[++top] = data;
  } 

  // 出栈
  public T pop() {
    if (isEmpty()) {
      return null;
    }
    return ary[top--];
  } 

  // 查看栈顶
  public T peek() {
    return ary[top];
  } 

  //栈是否为空
  public boolean isEmpty() {
    return top == -1;
  } 

  //栈是否满
  public boolean isFull() {
    return top == max - 1;
  } 

  //size
  public int size() {
    return top + 1;
  } 

  public static void main(String[] args) {
    StackS<Integer> stack = new StackS<Integer>(3);
    for (int i = 0; i < 5; i++) {
      stack.push(i);
      System.out.println("size:" + stack.size());
    }
    for (int i = 0; i < 5; i++) {
      Integer peek = stack.peek();
      System.out.println("peek:" + peek);
      System.out.println("size:" + stack.size());
    }
    for (int i = 0; i < 5; i++) {
      Integer pop = stack.pop();
      System.out.println("pop:" + pop);
      System.out.println("size:" + stack.size());
    } 

    System.out.println("----"); 

    for (int i = 5; i > 0; i--) {
      stack.push(i);
      System.out.println("size:" + stack.size());
    }
    for (int i = 5; i > 0; i--) {
      Integer peek = stack.peek();
      System.out.println("peek:" + peek);
      System.out.println("size:" + stack.size());
    }
    for (int i = 5; i > 0; i--) {
      Integer pop = stack.pop();
      System.out.println("pop:" + pop);
      System.out.println("size:" + stack.size());
    }
  }
}

上面的例子,有一个maxSize的规定,因为数组是要规定大小的,若想无限制,可以使用其他结构来做存储,当然也可以new一个新的长度的数组。
例,使用LinkedList存储来实现栈

public class StackSS<T> {
  private LinkedList<T> datas; 

  public StackSS() {
    datas = new LinkedList<T>();
  } 

  // 入栈
  public void push(T data) {
    datas.addLast(data);
  } 

  // 出栈
  public T pop() {
    return datas.removeLast();
  } 

  // 查看栈顶
  public T peek() {
    return datas.getLast();
  } 

  //栈是否为空
  public boolean isEmpty() {
    return datas.isEmpty();
  } 

  //size
  public int size() {
    return datas.size();
  } 

  public static void main(String[] args) {
    StackS<Integer> stack = new StackS<Integer>(3);
    for (int i = 0; i < 5; i++) {
      stack.push(i);
      System.out.println("size:" + stack.size());
    }
    for (int i = 0; i < 5; i++) {
      Integer peek = stack.peek();
      System.out.println("peek:" + peek);
      System.out.println("size:" + stack.size());
    }
    for (int i = 0; i < 5; i++) {
      Integer pop = stack.pop();
      System.out.println("pop:" + pop);
      System.out.println("size:" + stack.size());
    } 

    System.out.println("----");
    for (int i = 5; i > 0; i--) {
      stack.push(i);
      System.out.println("size:" + stack.size());
    }
    for (int i = 5; i > 0; i--) {
      Integer peek = stack.peek();
      System.out.println("peek:" + peek);
      System.out.println("size:" + stack.size());
    }
    for (int i = 5; i > 0; i--) {
      Integer pop = stack.pop();
      System.out.println("pop:" + pop);
      System.out.println("size:" + stack.size());
    }
  }
}

例,单词逆序,使用Statck结构

public class WordReverse { 

  public static void main(String[] args) {
    reverse("株式会社");
  } 

  static void reverse(String word) {
    if (word == null) return;
    StackSS<Character> stack = new StackSS<Character>();
    char[] charArray = word.toCharArray();
    int len = charArray.length;
    for (int i = 0; i <len; i++ ) {
      stack.push(charArray[i]);
    }
    StringBuilder sb = new StringBuilder();
    while (!stack.isEmpty()) {
      sb.append(stack.pop());
    }
    System.out.println("反转后:" + sb.toString());
  }
}

打印:

反转后:社会式株

模拟队列(一般队列、双端队列、优先级队列)
队列:
先进先出,处理类似排队的问题,先排的,先处理,后排的等前面的处理完了,再处理
对于插入和移除操作的时间复杂度都为O(1),从后面插入,从前面移除
双端队列:
即在队列两端都可以insert和remove:insertLeft、insertRight,removeLeft、removeRight
含有栈和队列的功能,如去掉insertLeft、removeLeft,那就跟栈一样了;如去掉insertLeft、removeRight,那就跟队列一样了
一般使用频率较低,时间复杂度 O(1)
优先级队列:
内部维护一个按优先级排序的序列。插入时需要比较查找插入的位置,时间复杂度O(N), 删除O(1)

/*
 * 队列  先进先出,一个指针指示插入的位置,一个指针指示取出数据项的位置
 */
public class QueueQ<T> {
  private int max;
  private T[] ary;
  private int front; //队头指针 指示取出数据项的位置
  private int rear; //队尾指针 指示插入的位置
  private int nItems; //实际数据项个数 

  public QueueQ(int size) {
    this.max = size;
    ary = (T[]) new Object[max];
    front = 0;
    rear = -1;
    nItems = 0;
  }
  //插入队尾
  public void insert(T t) {
    if (rear == max - 1) {//已到实际队尾,从头开始
      rear = -1;
    }
    ary[++rear] = t;
    nItems++;
  }
  //移除队头
  public T remove() {
    T temp = ary[front++];
    if (front == max) {//列队到尾了,从头开始
      front = 0;
    }
    nItems--;
    return temp;
  }
  //查看队头
  public T peek() {
    return ary[front];
  } 

  public boolean isEmpty() {
    return nItems == 0;
  } 

  public boolean isFull() {
    return nItems == max;
  } 

  public int size() {
    return nItems;
  } 

  public static void main(String[] args) {
    QueueQ<Integer> queue = new QueueQ<Integer>(3);
    for (int i = 0; i < 5; i++) {
      queue.insert(i);
      System.out.println("size:" + queue.size());
    }
    for (int i = 0; i < 5; i++) {
      Integer peek = queue.peek();
      System.out.println("peek:" + peek);
      System.out.println("size:" + queue.size());
    }
    for (int i = 0; i < 5; i++) {
      Integer remove = queue.remove();
      System.out.println("remove:" + remove);
      System.out.println("size:" + queue.size());
    } 

    System.out.println("----"); 

    for (int i = 5; i > 0; i--) {
      queue.insert(i);
      System.out.println("size:" + queue.size());
    }
    for (int i = 5; i > 0; i--) {
      Integer peek = queue.peek();
      System.out.println("peek:" + peek);
      System.out.println("size:" + queue.size());
    }
    for (int i = 5; i > 0; i--) {
      Integer remove = queue.remove();
      System.out.println("remove:" + remove);
      System.out.println("size:" + queue.size());
    }
  } 

}
/*
 * 双端队列<span style="white-space:pre"> </span>两端插入、删除
 */
public class QueueQT<T> {
  private LinkedList<T> list; 

  public QueueQT() {
    list = new LinkedList<T>();
  } 

  // 插入队头
  public void insertLeft(T t) {
    list.addFirst(t);
  } 

  // 插入队尾
  public void insertRight(T t) {
    list.addLast(t);
  } 

  // 移除队头
  public T removeLeft() {
    return list.removeFirst();
  } 

  // 移除队尾
  public T removeRight() {
    return list.removeLast();
  } 

  // 查看队头
  public T peekLeft() {
    return list.getFirst();
  } 

  // 查看队尾
  public T peekRight() {
    return list.getLast();
  } 

  public boolean isEmpty() {
    return list.isEmpty();
  } 

  public int size() {
    return list.size();
  } 

}
/*
 * 优先级队列  队列中按优先级排序,是一个有序的队列
 */
public class QueueQP {
  private int max;
  private int[] ary;
  private int nItems; //实际数据项个数 

  public QueueQP(int size) {
    this.max = size;
    ary = new int[max];
    nItems = 0;
  }
  //插入队尾
  public void insert(int t) {
    int j;
    if (nItems == 0) {
      ary[nItems++] = t;
    } else {
      for (j = nItems - 1; j >= 0; j--) {
        if (t > ary[j]) {
          ary[j + 1] = ary[j]; //前一个赋给后一个 小的在后    相当于用了插入排序,给定序列本来就是有序的,所以效率O(N)
        } else {
          break;
        }
      }
      ary[j + 1] = t;
      nItems++;
    }
    System.out.println(Arrays.toString(ary));
  }
  //移除队头
  public int remove() {
    return ary[--nItems]; //移除优先级小的
  }
  //查看队尾 优先级最低的
  public int peekMin() {
    return ary[nItems - 1];
  } 

  public boolean isEmpty() {
    return nItems == 0;
  } 

  public boolean isFull() {
    return nItems == max;
  } 

  public int size() {
    return nItems;
  } 

  public static void main(String[] args) {
    QueueQP queue = new QueueQP(3);
    queue.insert(1);
    queue.insert(2);
    queue.insert(3);
    int remove = queue.remove();
    System.out.println("remove:" + remove); 

  } 

}
(0)

相关推荐

  • java 数据结构中栈和队列的实例详解

    java 数据结构中栈和队列的实例详解 栈和队列是两种重要的线性数据结构,都是在一个特定的范围的存储单元中的存储数据.与线性表相比,它们的插入和删除操作收到更多的约束和限定,又被称为限定性的线性表结构.栈是先进后出FILO,队列是先进先出FIFO,但是有的数据结构按照一定的条件排队数据的队列,这时候的队列属于特殊队列,不一定按照上面的原则. 实现栈:采用数组和链表两种方法来实现栈 链表方法: package com.cl.content01; /* * 使用链表来实现栈 */ public cl

  • Java数据结构之循环队列简单定义与用法示例

    本文实例讲述了Java数据结构之循环队列简单定义与用法.分享给大家供大家参考,具体如下: 一.概述: 1.原理: 与普通队列的区别在于循环队列添加数据时,如果其有效数据end == maxSize - 1(最大空间)的话,end指针又移动到-1的位置 删除数据时,如果head== maxSize时 head指针移动到0的位置 2.示例图: 二.实现代码: package com.java.queue; /** * @描述 对列 * @项目名称 Java_DataStruct * @包名 com.

  • java数据结构与算法之双向循环队列的数组实现方法

    本文实例讲述了java数据结构与算法之双向循环队列的数组实现方法.分享给大家供大家参考,具体如下: 需要说明的是此算法我并没有测试过,这里给出的相当于伪代码的算法思想,所以只能用来作为参考! package source; public class Deque { private int maxSize; private int left; private int right; private int nItems; private long[] myDeque; //constructor p

  • Java数据结构之队列的简单定义与使用方法

    本文实例讲述了Java数据结构之队列的简单定义与使用方法.分享给大家供大家参考,具体如下: 一.概述: 1.说明: 队列的原则时先进先出,就像生活中排队取票一样,谁排在前面谁先得到 2.有五个属性: 1)数组元素 2)最大空间 3)长度 4)队头 5)队尾 3.示例图: 二.代码实现 /** * @描述 对列 * @项目名称 Java_DataStruct * @包名 com.java.stack * @类名 Queue * @author chenlin * @version 1.0 * @S

  • Java数组模拟优先级队列数据结构的实例

    优先级队列 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这种数据结构. 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 .对于优先权相同的元素,可按先进先出次序处理或按任意优先

  • Java数据结构之队列(动力节点Java学院整理)

    队列的定义: 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表. (1)允许删除的一端称为队头(Front). (2)允许插入的一端称为队尾(Rear). (3)当队列中没有元素时称为空队列. (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表. 队列的修改是依先进先出的原则进行的.新来的成员总是加入队尾,每次离开的成员总是队列头上的(不允许中途离队). 队列的存储结构及实现 队列的顺序存储结构 (1) 顺序队列的定义: 队列

  • java 数据结构之栈与队列

    java 数据结构之栈与队列 一:对列 队列是一种先进先出的数据结构 实现代码: package Queue; /* * 使用java构建队列,并模拟实现队列的入队和出对方法 */ public class Queue { //队列类 private int maxSize; //定义队列的长度 private int[] arrQueue; //队列 private int rear; //定义队列的尾指针 private int front; //定义队列的头指针 private int e

  • Java数据结构之有效队列定义与用法示例

    本文实例讲述了Java数据结构之有效队列定义与用法.分享给大家供大家参考,具体如下: /** * @描述 有序对列 * 从任何位置插入数据都是有序的 * @项目名称 Java_DataStruct * @包名 com.java.stack * @类名 Queue * @author chenlin */ public class SequeQueue { private long[] arr; private int maxSize;// 最大空间 private int len;// 有效长度

  • Java模拟栈和队列数据结构的基本示例讲解

    栈和队列: 一般是作为程序员的工具,用于辅助构思算法,生命周期较短,运行时才被创建: 访问受限,在特定时刻,只有一个数据可被读取或删除: 是一种抽象的结构,内部的实现机制,对用户不可见,比如用数组.链表来实现栈. 模拟栈结构 同时,只允许一个数据被访问,后进先出 对于入栈和出栈的时间复杂度都为O(1),即不依赖栈内数据项的个数,操作比较快 例,使用数组作为栈的存储结构 public class StackS<T> { private int max; private T[] ary; priv

  • java中栈和队列的实现和API的用法(详解)

    在java中要实现栈和队列,需要用到java集合的相关知识,特别是Stack.LinkedList等相关集合类型. 一.栈的实现 栈的实现,有两个方法:一个是用java本身的集合类型Stack类型:另一个是借用LinkedList来间接实现Stack. 1.Stack实现 直接用Stack来实现非常方便,常用的api函数如下: boolean        isEmpty() // 判断当前栈是否为空 synchronized E        peek() //获得当前栈顶元素 synchro

  • 栈和队列数据结构的基本概念及其相关的Python实现

    先来回顾一下栈和队列的基本概念: 相同点:从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同. 不同点:栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表. 队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表.它们是完全不同的数据类型.除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的"限定". 栈必须按"后进先出"的规则进行操作:比如说,小学老师批改学生的作业,如果不打乱作业本的顺

  • Java实现栈和队列面试题

    面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min()的栈,要求min.push.pop.的时间复杂度都是O(1) (6)判断栈的push和pop序列是否一致 1.栈的创建: 我们接下来通过链表的形式来创建栈,方便扩充. 代码实现: public class Stack { public Node head; public Node current; //方法

  • Swift算法之栈和队列的实现方法示例

    一.概述 栈和队列在数据结构中是比较重要的一个数据结构. 其实对于栈和队列并不需要太深入的介绍,栈和队列的核心内容是栈是先进后出.队列是先进先出.在实际开发中有些场景也可能会用到,比如 APP 中用户可以撤销操作,比如下棋 APP 中的悔棋操作,返回上一步就是先进后出(后进先出),也就是栈的特性. 比如在售票 APP 中,为先下订单的用户先出票,就需要用到队列.当然这两个只是在简单场景下的情况,实际开发中情况可能更复杂,比如售票 APP 为会员用户优先出票等. 接下来就通过 Swift 去实现栈

  • Python实现栈和队列的简单操作方法示例

    本文实例讲述了Python实现栈和队列的简单操作方法.分享给大家供大家参考,具体如下: 先简单的了解一下数据结构里面的栈和堆: 栈和队列是两种基本的数据结构,同为容器类型.两者根本的区别在于: stack:后进先出 queue:先进先出 stack和queue是不能通过查询具体某一个位置的元素而进行操作的.但是他们的排列是按顺序的 对于stack我们可以使用python内置的list实现,因为list是属于线性数组,在末尾插入和删除一个元素所使用的时间都是O(1),这非常符合stack的要求.当

  • 一起来学习Java的栈和队列

    目录 栈 队列 阻塞队列 双端队列 总结 栈 package com.yuzhenc.collection; import java.util.Stack; /** * @author: yuzhenc * @date: 2022-03-20 15:41:36 * @desc: com.yuzhenc.collection * @version: 1.0 */ public class Test26 { public static void main(String[] args) { Stack

  • LinkedList学习示例模拟堆栈与队列数据结构

    堆栈:先进后出First in Last Out FILO 如同一个杯子队列:先进先出 First in First out FIFO  如同一个水管 复制代码 代码如下: class Duilie{    private LinkedList link;    Duilie(){        link = new LinkedList();    }    public void myAdd(Object obj){        link.addFirst(obj);    }    pu

  • java和matlab画多边形闭合折线图示例讲解

    1.使用matlab作闭合多边形图 没有找到直接画多边形的函数,只能是将各个点的坐标保存在数组中,将一个点与其相邻的点相连,并将最后一个点与第一个点连接.下面是一个示例的.m文件: 复制代码 代码如下: clear;clc;a=[0 2 4 6 8 10 12 14;0 2 1 4 6 6 5 7];  %要连接的点坐标 x;y[n,m]=size(a);for i=1:m-1;    line([a(1,i),a(1,i+1)],[a(2,i),a(2,i+1)]);  %连接节点line([

  • Java模拟多线程实现抢票代码实例

    这篇文章主要介绍了Java模拟多线程实现抢票,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 实现100张票抢购的demo 这里需要一个变量,来保存100张 局部变量: 定义在方法内,方法运行存在,方法运行结束销毁,无法保存一个持久化数据!!! 成员变量: 保存在类对象内,创建对象之后存在,对象不销毁成员变量也不会被内存收回.因为 在每一个类对象中,都存在一个对应的成员变量,这些成员变量不是同一个数据.不是 共享资源,不合适!!! 静态成员变量:

随机推荐