java数据结构和算法-2,栈和队列
2017-05-20 23:35
357 查看
在Java的世界里讨论的最多的应该是栈和队才对吧!但这里是数据结构和算法,并不是Java虚拟机。
废话不说,码上见!
1、栈
public class StackTest { private int[] arr;//用数组模拟栈的结构 private int top;//栈顶的位置 public StackTest(){ arr = new int[10]; top = -1; } //可以自定义栈的大小 public StackTest(int maxSize){ arr = new int[maxSize]; top = -1; } //入栈 public void push(int value){ arr[++top] = value; } //出栈 public int pop(){ return arr[top--]; } //获取栈顶元素 public int top(){ return arr[top]; } public static void main(String[] args) { StackTest s = new StackTest(3); s.push(12); s.push(15); s.push(0); System.out.println(s.top()); } }
输出结果:
0
重点:
这里只是模拟栈的结构,准确点来说只是模拟栈的最基础结构,真正的栈基本都是计算机系统管理的,涉及到寄存器方面的知识
栈有栈顶和栈底之分,还是那句老话,先进后出,想象成一个箱子,先放进去的压在箱底,最后才能拿出来,箱子也有装满的时候,所以慎用递归,内存不足的情况下,方法调用的深度和变量的使用也得注意,不然会爆帧,不过现在的计算机比较难遇到咯~~
2、队列
public class QueueTest { private int[] arr;//同样用数组模拟队列 private int head = 0;//队列头部位置,首元素索引为0 private int tail = -1;//队列尾部,现在没元素,先给-1 public QueueTest(){ arr = new int[10]; } public QueueTest(int maxSize){ arr = new int[maxSize]; } //入队,从前往后添加元素 public void in(int element){ arr[++tail] = element; } //出队,从前往后输出元素 public int out(){ return arr[head--]; } }
队列的main的方法就不写了,同样的道理
重点(feihua):
1. 和栈相反,先进先出,想象成一个隧道,车子一辆一辆通过
2. 队列的使用我们用的较多的是多线程,不过平时用框架的话基本都帮我们处理好了而已
3、循环队列
public class CycleQueueTest { private int elements = 0;//有效元素个数 private int[] arr;//声明一个数组,用于存放队列的元素 private int head = 0;//队头位置 private int tail = -1;//队尾位置 public CycleQueueTest(){ arr = new int[6]; } public CycleQueueTest(int maxSize){ arr = new int[maxSize]; } //入队 public int in(int element){ int h = 0;//用于输出队头元素 if (isFull()) {//如果数组满了,则开始队列的循环 if (head == arr.length) {//如果队头循环一轮结束后回到原来位置,那么这里也还原队头和队尾的位置指向 head = 0; tail = -1; arr[++tail] = element; h = arr[head]; }else{ /* * 如果一轮没有循环结束,则插入一个新元素的时候,队头和队尾都向前移一个单元, * 为什么前移一个单元?其实如果不移的话,你也可以重新为数组排序,把数组的每 * 个元素统一往后移一个单元,然后在数组的第一个元素的位置替换新入队的数就行 */ h = arr[head]; head++; tail = head-1; arr[tail] = element; } }else{//这里是第一轮数组还没满的时候执行的操作 arr[++tail] = element; elements ++; h = arr[head]; } return h; } //出队 public int out(){ return arr[head--]; } //判断队列是否满了 public boolean isFull(){ return arr.length == elements; } public static void main(String[] args) { CycleQueueTest c = new CycleQueueTest(); c.in(1); c.in(2); c.in(3); c.in(4); c.in(5); c.in(1); c.in(2); c.in(3); c.in(4); c.in(5); c.in(8); c.in(9); c.in(10); for (int i = 0; i < c.arr.length; i++) { System.out.println(c.arr[i]); } } }
输出结果:
10 3 4 5 8 9
重点:
个人觉得搞清楚队头(head)和队尾(tail)指向的元素就行了,整个过程就像转盘一样,队头和队尾指向的位置不停地轮转
至于实际用途就不知道在哪里有用到了,功力还不够深,学识尚浅,还请各位前辈和有识之士指教!
相关文章推荐
- Java数据结构和算法-栈和队列(4-解析算术表达式)
- java数据结构和算法------队列
- Java数据结构和算法--栈与队列
- Java数据结构和算法(五)——队列
- 队列的创建 入队出队 Java数据结构与算法
- Java数据结构和算法-栈和队列(3-优先级队列)
- 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现
- Java数据结构和算法(五)——队列
- Java数据结构和算法(五)——队列
- Java数据结构和算法(五)——队列
- Java数据结构和算法-栈和队列(1-前言+栈)
- Java数据结构和算法--栈与队列
- java数据结构与算法之(Queue)队列设计与实现
- java数据结构与算法之(Queue)队列设计与实现
- Java数据结构与算法 - 栈和队列
- Java数据结构和算法--栈与队列
- java数据结构与算法 第4章 栈和队列
- JAVA数据结构和算法:第三章(栈和队列)
- Java数据结构与算法解析(三)——队列与背包
- Java数据结构与算法:队列