栈与队列和数组、链表、树这几种数据结构不太同样。栈与队列主要是作为程序员的工具来使用,它们主要作为构思算法的辅助工具,而不是彻底的数据存储工具。程序员
它们的生命周期比数组那些要短得多,在程序执行期间它们才会被建立,任务执行完就会被销毁。web
一 栈
栈是一种只能在一端进行插入和删除数据的数据结构,这一端被称为栈顶(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),栈的操做不依赖栈中元素大小,栈不须要移动和比较操做。微信
二 队列
队列的特色是先进先出。队列也是用数组来实现。数据结构
用数组实现队列,并完成经常使用操做——出队、入队、查看元素、判断队列是否为空等操做。app
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)。工具
用数组实现优先级队列,并完成经常使用操做——出队、入队、查看元素、判断队列是否为空等操做。ui
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源创计划”,欢迎正在阅读的你也加入,一块儿分享。