java面向对象的栈 队列 优先级队列的比较
栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多。在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务;当完成任务之后,他们就会被销毁。这三个数据结构还有一个特点就是访问是受到限制的,即在特定时刻只有一个数据项可以被读取或者被删除,但是所谓的移除并不是真的删除,数据项依然在这些数据结构中,只不过因为指针已经指向其他数据项,没有办法访问到,当添加新的数据项时,当初移除的数据项被替代从而永远消失。
栈 队列 优先级队列的模拟思想
1.栈:栈遵循先进后出(FILO)模式最后插入的数据项最先被移除,而且只能访问最后的数据项,只有当移除这个数据项之后才能访问倒数第二项的数据项。
2.队列:队列遵循先进先出(FIFO)模式首先被插入的数据项最先被移除,而且只能访问访问第一个数据项,只有当移除这个数据项之后才能访问第二项的数据项。特别的为了避免队列不满却不能插入新数据项,可以让队头队尾指针绕回到数组开始的位置,这就是循环队列。
3.优先级队列:优先级队列和队列的特性相同有队头和队尾,除此之外在优先级队列中,数据项按关键字的值有序,这样关键字最小的数据项或最大的数据项(视情况而定)总是在队头,数据项插入的时候会按照顺序插入到合适的位置以确保队列的顺序。
栈 队列 优先级队列的效率
栈:插入操作需要O(1),删除操作需要O(1)。
队列:插入操作需要O(1),删除操作需要O(1)。
优先级队列:插入操作需要O(N),删除操作需要O(1)。
栈 队列 优先级队列的指针
栈:top= -1。
队列:rear = -1, front = 0。
优先级队列:nItems = 0。
栈 队列 优先级队列的java代码
栈
package sy; import sy.Stack; class Stack{
//定义栈长度
private int maxSize;
//定义栈
private long[] stackArray;
//定义栈指针
private int top;
//定义构造方法
public Stack(int n){
maxSize = n;
stackArray = new long[maxSize];
top = -1;
}
//定义插入方法
public void push(long n){
//栈长度先增加,再向栈中压入数据
stackArray[++top] = n;
}
//定义删除方法
public long pop(){
//先向栈中压入数据,栈长度再减少
return stackArray[top--];
}
//定义查找方法
public long peek(){
return stackArray[top];
}
//定义查空方法
public boolean isEmpty(){
return (top == -1);
}
//定义查满方法
public boolean isFull(){
return (top == maxSize - 1);
}
}
public class App {
public static void main(String[] args){
Stack theStack = new Stack(10);
theStack.push(20);
theStack.push(40);
theStack.push(60);
theStack.push(80); while(!theStack.isEmpty())
{
long value = theStack.pop();
System.out.print(value);
System.out.print(" "); }
System.out.println("");
}
}
队列(带nItems)
package sy; class Queue{
//定义队列长度
private int maxSize;
//定义队列
private long[] queArray;
//定义队首指针
private int front;
//定义队尾指针
private int rear;
//定义数据项个数
private int nItems; //定义构造方法
public Queue(int n){
maxSize = n;
queArray = new long[maxSize];
front = 0;
rear = -1;
nItems = 0;
}
//定义插入方法
public void insert(long n){
//判断是否循环至队首
if(rear == maxSize - 1)
{
rear = -1;
}
//先自增再赋值
queArray[++rear] = n;
nItems++;
}
//定义删除方法
public long remove(){
//先赋值在自增
long temp = queArray[front++];
//判断是否循环至队首
if(front == maxSize)
{
front = 0;
}
nItems--;
return temp;
}
//定义查找首项方法
public long peekFront(){
return queArray[front];
} public boolean isEmpty(){
return (nItems == 0);
} public boolean isFull(){
return (nItems == maxSize);
} public int size(){
return nItems;
}
} public class App {
public static void main(String[] args){
Queue theQueue = new Queue(5); theQueue.insert(10);
theQueue.insert(20);
theQueue.insert(30);
theQueue.insert(40);
theQueue.remove();
theQueue.remove();
theQueue.remove();
theQueue.insert(50);
theQueue.insert(60);
theQueue.insert(70);
theQueue.insert(80); while(!theQueue.isEmpty())
{
long n = theQueue.remove();
System.out.print(n);
System.out.print(" "); }
System.out.print(""); }
}
注意:insert()和remove方法中分别递增和递减了nItems,当处理大量的插入和移除操作的时候,就会影响性能。
队列(没有nItems)
package sy; //import aa.Queue; class Queue{
//定义队列长度
private int maxSize;
//定义队列
private long[] queArray;
//定义队首指针
private int front;
//定义队尾指针
private int rear; //定义构造方法
public Queue(int n){
//这里最大值要加一
maxSize = n + 1;
queArray = new long[maxSize];
front = 0;
rear = -1;
}
//定义插入方法
public void insert(long n){
//判断是否循环至队首
if(rear == maxSize - 1)
{
rear = -1;
}
//先自增再赋值
queArray[++rear] = n;
}
//定义删除方法
public long remove(){
//先赋值在自增
long temp = queArray[front++];
//判断是否循环至队首
if(front == maxSize)
{
front = 0;
}
return temp;
}
//定义查找首项方法
public long peekFront(){
return queArray[front];
} public boolean isEmpty(){
return (rear + 1 == front || (front + maxSize - 1 == rear));
} public boolean isFull(){
return (rear + 2 == front || (front + maxSize - 2 == rear));
}
} public class App {
public static void main(String[] args){
Queue theQueue = new Queue(5); theQueue.insert(10);
theQueue.insert(20);
theQueue.insert(30);
theQueue.insert(40);
theQueue.remove();
theQueue.remove();
theQueue.remove();
theQueue.insert(50);
theQueue.insert(60);
theQueue.insert(70);
theQueue.insert(80); while(!theQueue.isEmpty())
{
long n = theQueue.remove();
System.out.print(n);
System.out.print(" "); }
System.out.print(""); }
}
优先级队列
package aa; import java.io.IOException;
//在这个队列中小的在后,队列有大到小排列,这里只能访问最后一个数据项
class Priority{
private int maxSize;
private long[] queArray;
private int nItems; public Priority(int s){
maxSize = s;
queArray = new long[maxSize];
nItems = 0;
} public void insert(long i){
//定义一个临时变量
int j;
//判断数据项是否为零
if(nItems == 0)
{
//如果为零插入数据,数据项增加
queArray[nItems++] = i;
}
else
{
//数据项从后往前遍历,注意j>=0
for(j = nItems - 1; j >= 0; j--)
{
//判断插入项是否大于遍历的数据项
if(i > queArray[j])
{
//如果大于则从j的数据项开始每一项都后移一位
queArray[j+1] = queArray[j];
}
else
{
break;
}
}
//在for循环中最后一次循环的最后阶段执行了j--,所以在这里加回来,这样for循环外的j+1相当于for循环内的判断的j
queArray[j + 1] = i;
nItems++;
}
} public long remove(){
return queArray[--nItems];
} public long peekMin(){
return queArray[nItems - 1];
} public boolean isEmpty(){
return (nItems == 0);
} public boolean isFull(){
return (nItems == maxSize);
}
}
public class PriorityApp {
public static void main(String[] args) throws IOException{
Priority thePri = new Priority(5);
thePri.insert(30);
thePri.insert(50);
thePri.insert(10);
thePri.insert(40);
thePri.insert(20); while(!thePri.isEmpty())
{
long item = thePri.remove();
System.out.print(item + " ");
}
System.out.println("");
}
}
java面向对象的栈 队列 优先级队列的比较的更多相关文章
- java数据结构与算法值优先级队列
一.优先级队列 什么是优先级队列:优先级队列是一种比栈和队列更加常用的一种数据结构.在优先级队列中,数据项按照关键字的值有序.数据项插入到队列中时,会按照顺序插入到合适的位置,用来保证队列的顺序. 生 ...
- 2018.9.5 Java中使用栈来模拟队列
栈的规律是是先进后出 队列的规律是先进先出 栈模拟队列 首先我们定义两个栈,一个放数据,一个出数据,判断B栈是否有元素,有元素则直接pop:没有元素则需要我们将A里面的元素出栈然后放到B里面,再取出, ...
- JAVA:使用栈实现一个队列
使用栈实现一个队列,需要弄清楚栈和队列的区别: 栈:先进后出: 队列:先进先出. 实现思路: 1)通过两个栈(pushStack / popStack)对倒,确保 popStack 栈的出栈顺序与队列 ...
- 自己动手实现java数据结构(八) 优先级队列
1.优先级队列介绍 1.1 优先级队列 有时在调度任务时,我们会想要先处理优先级更高的任务.例如,对于同一个柜台,在决定队列中下一个服务的用户时,总是倾向于优先服务VIP用户,而让普通用户等待,即使普 ...
- java两个栈实现一个队列&&两个队列实现一个栈
栈:先进后出 队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...
- Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较
判断括号是否匹配:调用java本身 import java.util.Stack; public class Solution { public boolean isValid(String s){ ...
- java数据结构----队列,优先级队列
1.队列:和栈中的情况不同,队列中的数据项不总是从数组下标0开始,移除一个数据项后,队头指针会指向下标较高的数据项,其特点:先入先出 2.图解 3.队列的实现代码: 3.1.Queue.java pa ...
- java 堆排,优先级队列,归并排序
堆排 堆排是基于二叉树而得来的 例如:对一个数组 可以转为二叉树: 二叉树特性父节点为 i , 左叶子节点为2i+1:右叶子节点为2i+2; 步骤分解: 1. 先从第一个非叶子节点(即下 ...
- STL学习系列七:优先级队列priority_queue容器
1.简介 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用,请对stl的类库,多做扩展性学习 这里给个例子: #include< ...
随机推荐
- objc中类方法里的self指的是什么
所有转出“博客园”,请您注明出处:http://www.cnblogs.com/xiaobajiu/p/4121431.html objc中类方法里的self指的是什么 在objc中是可以在类方法中使 ...
- duplicate symbol _OBJC_IVAR
duplicate symbol _OBJC_IVAR - Kingdev - 博客园 代码合并问题 git合并提示冲突文件为project.pbxproj,先去掉所有冲突提示<<< ...
- Java单例模式几种实现方式
在平时的工作.学员的学习以及面试过程中,单例模式作为一种常用的设计模式,会经常被面试官问到,甚至笔试会要求学员现场默写,下面将会就单例模式的实现思路和几种常见的实现方式进行简单的分享. 单例模式,是一 ...
- windows系统,MongoDB开启用户验证登录的正确姿势
MongoDB默认安装并没有开启用户名密码登录,这样太不安全了,百度出来的开启验证登录的文章,对初次使用MongoDB的小白太不友好了,总结下经验,自己写一份指引. 1,我的安装路径是C:\Progr ...
- tp5 的nginx配置
下面简单说明一下tp5运行在nginx上的配置. 原文地址:小时刻个人博客>http://small.aiweimeng.top/index.php/archives/tp5_nginx.htm ...
- Call to a member function allowField() on null 错误总结
Call to a member function allowField() on null 在空对象上调用 allowField() 没有该模型对象无法调用,需要创建相应的模型 错误版本: if ...
- 树莓派3B+学习笔记:11、查看硬件信息
1.查看CPU信息 cat /proc/cpuinfo 查看最后三行 如果只想查看最后三行,也可使用这个命令 /proc/cpuinfo lscpu 2.查看树莓派型号 cat /proc/devic ...
- Vue2.5入门-3
安装和使用 全局安装vue npm install --global vue-cli 创建基于webpack模板的新项目 vue init webpack my-project 安装依赖 cd my- ...
- Hibernate学习笔记四
1 整合log4j(了解) l slf4j 核心jar : slf4j-api-1.6.1.jar .slf4j是日志框架,将其他优秀的日志第三方进行整合. l 整合导入jar包 log4j 核心包 ...
- SSM-CRUD入门项目——查询
查询 1.基础查询 分析:访问项目主页 index.jsp 时应该跳转到列表页 我们可以在index.jsp发出查询员工列表请求,来到 list.jsp 使用插件 pageHelper 完成分页功能— ...