###1.栈 先进后出,后进先出
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
package com.fantj.dataStruct.stack;/** * 栈 * Created by Fant.J. * 2017/12/21 10:20 */public class MyStack { //底层是一个数组 private long []arr; private int top; /** * 默认构造方法 */ public MyStack(){ arr = new long[10]; top = -1; } /** * 带参数的构造方法 */ public MyStack(int maxsize){ arr = new long[maxsize]; top = -1; } /** * 添加数据 */ public void push(int value){ arr[++top] = value; } /** * 移除pop数据 */ public long pop(){ return arr[top--]; //返回数据并递减 } /** * 查看数据 */ public long peek(){ return arr[top]; //返回数据 } /** * 判断 是否是空 */ public boolean isEmpty(){ return top == -1; //top为-1,就是空 } /** * 判断 是否满了 */ public boolean isFull(){ return top == arr.length-1; }}复制代码
###2.队列 先进先出
队列是一种特殊的,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头
package com.fantj.dataStruct.queue;/** * 队列(先进先出) * Created by Fant.J. * 2017/12/21 10:44 */public class MyQueue { //底层使用数组 private long []arr; //有效数据的多少 private int elements; //队头 private int front; //队尾 private int end; /** * 默认构造方法 */ public MyQueue(){ arr = new long[10]; elements = 0; front = 0; end = -1; } /** * 带参数的构造方法,参数为数组大小 */ public MyQueue(int maxsize){ arr = new long[maxsize]; elements = 0; front = 0; end = -1; } /** * 添加数据,从队尾插入 */ public void insert(long value){ arr[++end] = value; elements++; } /** * 删除数据,从队尾删除 */ public long remove(){ elements--; return arr[front++]; } /** * 查看数据,从对头查看 */ public long peek(){ return arr[front]; } /** * 判断是否为空 */ public boolean isEmpty(){ return elements == 0; } /** * 判断是否满了 */ public boolean isFull(){ return elements == arr.length; }}复制代码
但是普通队列有个问题,就是你在进行一轮存取数据操作后,因为end=arr.length-1;front = arr.lenth-1;所以,会报错越界异常。因此我们会在插入删除前加入判断,让这个队列循环利用。 --循环队列 ###2.队列pro --循环队列
为充分利用向量空间,克服""现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以的方式来在实际编程应用中来实现。
修改两处:insert和remove
/** * 添加数据,从队尾插入 */ public void insert(long value){ if (end == arr.length-1){ end = -1; //如果到达了队列尽头,初始化end } arr[++end] = value; elements++; } /** * 删除数据,从队尾删除 */ public long remove(){ long value = arr[front++]; if (front == arr.length){ front=0; //如果到达了队列尽头,初始化front } elements--; return value; }复制代码
源码地址: