栈与队列简介
栈与队列和数组、链表、树这几种数据结构不太一样。栈与队列主要是做为程序员的工具来使用,它们主要做为构思算法的辅助工具,而不是完全的数据存储工具。
它们的生命周期比数组那些要短得多,在程序执行期间它们才会被创建,任务执行完就会被销毁。
一 栈
栈是一种只能在一端进行插入和删除数据的数据结构,这一端被称为栈顶(top)。其特点简单来讲就是先进后出。栈的主要机制可以用数组来实现,当然也可以用链表来实现。
用数组实现栈,并完成常用操作——出栈、入栈、查看元素(只能查看栈顶元素)、判断栈是否为空等操作。
public class StackTest {
private long[] arr;
// 栈顶
private int top;
public StackTest(){
arr = new long[10];
top = -1;
}
public StackTest(int maxsize){
arr = new long[maxsize];
top = -1;
}
/**
* 添加数据
* @param value
*/
public void push(int value){
arr[++top] = value;
}
/**
* 移除数据
* @return
*/
public long pop() {
return arr[top--];
}
/**
* 查看数据
* @return
*/
public long peek(){
return arr[top];
}
public boolean isEmpty(){
return top == -1;
}
/***
* 判断是否满了
* @return
*/
public boolean isFull(){
return top == arr.length-1;
}
}
栈的所有操作复杂度都为O(1),栈的操作不依赖栈中元素大小,栈不需要移动和比较操作。
二 队列
队列的特点是先进先出。队列也是用数组来实现。
用数组实现队列,并完成常用操作——出队、入队、查看元素、判断队列是否为空等操作。
public class QueueTest {
private long[] arr;
// 有效数据的大小
private int elements;
// 队头
private int front;
// 队尾
private int end;
public QueueTest(){
arr = new long[10];
elements = 0;
front = 0;
end = -1;
}
public QueueTest(int maxsize){
arr = new long[maxsize];
elements = 0;
front = 0;
end = -1;
}
/**
* 插入数据
* @param value
*/
public void insert(long value){
arr[++end] = value;
elements++;
}
/**
* 删除数据
* @return
*/
public long remove(){
elements--;
return arr[front++];
}
/**
* 查看数据,从对头查看
* @return
*/
public long peek(){
return arr[front];
}
/**
* 判断是否为空
* @return
*/
public boolean isEmpty(){
return elements == 0;
}
public boolean isFull(){
return elements == arr.length;
}
}
队列的插入、删除等操作的复杂度都为O(1)。
三 优先级队列
优先级队列和普通队列一样,也是一个队头,一个队尾,从队头移除元素,优先级队列中,数据项是有序的,这样插入数据的时候就会根据某种规则去比较,然后插入到队列合适的位置。因此,优先级队列插入的复杂度为O(N),删除和查看元素的复杂度为O(1)。
用数组实现优先级队列,并完成常用操作——出队、入队、查看元素、判断队列是否为空等操作。
public class FirstQueueTest {
private long[] arr;
// 有效数据的大小
private int elements;
// 队头
private int front;
// 队尾
private int end;
public FirstQueueTest(){
arr = new long[10];
elements = 0;
front = 0;
end = -1;
}
public FirstQueueTest(int maxsize){
arr = new long[maxsize];
elements = 0;
front = 0;
end = -1;
}
/**
* 插入数据
* @param value
*/
public void inser(long value){
if(elements == 0){
arr[++end] = value;
elements++;
}else{
// 按某种规则进行比较,这里使用value的大小比较,按从小到大排序
for(int i = elements-1;i>=0;i--){
if(value<arr[i]){
arr[i+1] = arr[i];
arr[i] = value;
}else{
arr[i+1] = value;
break;
}
}
elements++;
end++;
}
}
/**
* 删除数据
* @return
*/
public long remove(){
elements--;
return arr[front++];
}
/**
* 查看数据,从对头查看
* @return
*/
public long peek(){
return arr[front];
}
/**
* 判断是否为空
* @return
*/
public boolean isEmpty(){
return elements == 0;
}
public boolean isFull(){
return elements == arr.length;
}
}
四 总结
-
栈的特点是先进后出,栈只能查看栈顶的一个元素 -
队列的特点是先进先出,只能查看队头的一个元素 -
优先级队列插入一条元素,平均需要移动2/N个元素,因此插入的复杂度为O(N) -
栈和队列,可以用数组实现,也可以用其他数据结构实现 -
栈和队列是为了完成某些工作,手动构造的数据结构
本文分享自微信公众号 - Java旅途(Javatrip)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
电感最重要的公式
大家好,今天来给大家讲一个与电感有关的公式,也是我认为关于电感最重要的公式。这个公式是什么呢?就是下面这个: 这个公式来源于电感值本身特性。 为什么说这个公式是最重要的呢?因为它说明了电感的很多特性。比如, 电感电流不能突变 电感的储能大小 电感的电流与电压的相位关系 还有电感的阻抗为什么是jwL 电感电流不能突变 电感电流为什么不能突变呢?来看这个公式,U等于负的L乘以di比dt。Di比dt是指电流的变化率,电流突变,意味着di比dt无限大,会导致产生无限大的电压。尽管在实际电路中绝对的电流突变不存在,或多或少都会有时间,因此产生的电压总不会真的无穷大,但是是真的能产生很大的电压,高于电源电压都是可能会出现的。这种意外的高压会损坏器件。所以我们在一些感性的开关电路中,需要对感性器件留一个放电回路,避免产生高压。例如开关电源,继电器电路。通常是通过RC电路进行缓冲,也有的用二极管,TVS等。 电感储能公式 电感的储能也是由这个公式推导出来的,下面是推导过程,需要一些微积分的知识,感兴趣的可以看一下过程,不感兴趣的记下这个结果,电感储能为1/2LI^2,单位是焦耳。 电感在t时间内,电...
-
下一篇
一代经典之HP8753系列网络分析仪
今天的故事从一台战损级Agilent 8753ES说起。 笔者接触的第一款矢量网络分析仪就是Agilent 8753系列,当初的款型还比较早,都是挂HP的标(HP8753E/ES/ET等等),因为Agilent最早还是HP惠普公司旗下的子公司,后来其电子测量事业部独立出来成立的Agilent公司,所以目前市场上还流通的8753系列网络分析仪绝大多数还是挂Agilent标的,相对较新一点(但仍有近20年的历史了)。再之后Agilent公司主要就开始做生命科学和化学分析这一块,而测试测量又独立成了一个新公司就是现在的Keysight是德科技。(如有错误烦请评论指出)。 最早接触HP8753的时候那会是用它来分析天线的制程不良品(主要是笔记本电脑内置天线),由于制程的问题会有一些焊点偏移,焊接不良或是线材/端子短路/开路之类的功能性不良品,需要工程人员进行分析。所以对网络分析仪的了解基本还处于表层,也仅仅是看个波形而已。逐渐的由于对产品及仪表的了解及操作越来越熟练,就开始慢慢摸索网络分析仪更多的功用及各项功能的实际意义。坦白讲,由于工厂环境所至,绝大多数的人基本都处于死记硬背的去按按键,而不...
相关文章
文章评论
共有0条评论来说两句吧...


微信收款码
支付宝收款码