博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构与算法12-栈和队列-循环队列-优先级队列
阅读量:6080 次
发布时间:2019-06-20

本文共 2780 字,大约阅读时间需要 9 分钟。

hot3.png

无数据项计数的循环队列算法:

在判满和判空需要注意,由于是循环队列,所以有可能rear和front指针指向同一位置,但是出现的情况有很多,造成可空可满的情况,所以数据项要比存储空间少一,这样就能解决此问题。

又因为没有数据项技术,所以在统计数据项个数时也应该注意,如果front>rear用maxsize-front+(rear+1),否则用rear-front+1即可。

class Queue2 {	private int maxSize;	private long[] queArray;	private int front;	private int rear;	public Queue2(int s)	{		maxSize = s+1;		queArray = new long[maxSize];		front = 0;		rear = -1;			}	public void insert(long j)	{		if(rear == maxSize - 1);		rear = -1;		queArray[++rear] = j;			}	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 int size()	{		if(rear >= front)			return rear-front+1;		else			return (maxSize-front)+(rear+1);				}}class QueueApp2{	public static void main(String[] args)	{		Queue2 theQueue = new Queue2(5);		theQueue.insert(10);		theQueue.insert(11);		theQueue.insert(12);		theQueue.insert(14);		theQueue.remove();		theQueue.remove();		theQueue.remove();		theQueue.insert(77);		theQueue.insert(88);		theQueue.insert(99);		theQueue.insert(77777);		while(!theQueue.isEmpty())		{			long n = theQueue.remove();			System.out.println(n);			System.out.println(" ");		}		System.out.println(" ");	}}

队列效率:插入,移除速度均为O(1)。

双端队列:

双端队列就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和溢出数据项。这些方法可以叫做insertLeft()和insertRight(),以及removLeft()和removeRight().

如果严格禁止调用insertLeft()和removeLeft方法,那么双端队列就是栈。禁用insertLeft()和removeRight(或相反的另一对方法),它的功能就和队列一样了。双端队列在容器类库中有时会提供栈和队列的功能。

优先级队列

根据关键字大小决定数据项在队列中的位置

import java.io.IOException;class priorityQ {	private int maxSize;	private long[] queArray;	private int nItems;	public priorityQ(int s)	{		maxSize = s;		queArray = new long[maxSize];		nItems = 0;	}	public void insert(long item)	{		int j;		if(nItems==0)			queArray[nItems++] = item;		else		{			for(j=nItems-1;j>=0;j--)			{				if(item > queArray[j])					queArray[j+1] = queArray[j];				else					break;			}			queArray[j+1] = item;			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);		}		}	class priorityQApp	{		public static void main(String[] args) throws IOException		{			priorityQ thePQ = new priorityQ(5);			thePQ.insert(30);			thePQ.insert(50);			thePQ.insert(10);			thePQ.insert(20);			thePQ.insert(40);			while(!thePQ.isEmpty())			{				long item = thePQ.remove();				System.out.println(item + " ");							}			System.out.println(" ");		}	}
10 20 30 40 50

优先级效率:

插入,删除都为O(N)

但是数据项数量大,一般会采用堆

转载于:https://my.oschina.net/u/3829307/blog/1918761

你可能感兴趣的文章
mysql 用户 删除,新增和授权
查看>>
电脑安全防护7种武器
查看>>
用命令优化数据库
查看>>
我的友情链接
查看>>
Qt的信号和槽是如何工作的
查看>>
基于i.MX6UL实现PWM脉冲计数
查看>>
Oracle进程
查看>>
ubuntu改终端字体颜色
查看>>
salt 上手
查看>>
centos5.5 安装pptpd ***
查看>>
mysql
查看>>
360网盘资料分享地址,一些网上好视频地址
查看>>
最恐怖的网络***"流量秒封"
查看>>
我的友情链接
查看>>
Mybatis自动创建表和更新表结构
查看>>
小松鼠邮件(squirrelmail)服务器部署(squirrelmail+Postfix)
查看>>
java速度入门_十考试复习
查看>>
无间道
查看>>
UIimageView图片加载
查看>>
Python 17.5 使用模板
查看>>