栈与队列简介
时间:2022-07-24
本文章向大家介绍栈与队列简介,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
栈与队列和数组、链表、树这几种数据结构不太一样。栈与队列主要是做为程序员的工具来使用,它们主要做为构思算法的辅助工具,而不是完全的数据存储工具。
它们的生命周期比数组那些要短得多,在程序执行期间它们才会被创建,任务执行完就会被销毁。
一 栈
栈是一种只能在一端进行插入和删除数据的数据结构,这一端被称为栈顶(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)
- 栈和队列,可以用数组实现,也可以用其他数据结构实现
- 栈和队列是为了完成某些工作,手动构造的数据结构
- TensorFlow从0到1丨第2篇:TensorFlow核心编程
- AngularJS中的按需加载ocLazyLoad
- AngularJS driective 封装 自动滚动插件
- java类过滤器,防止页面SQL注入
- Web项目添加Maven支持
- Jquery 获取第一个子元素
- Dropwizard框架入门
- Java 解析Excel文件为JSON
- SQL语句大小写是否区分的问题,批量修改整个数据库所有表所有字段大小写
- CentOS 6.5 安装nginx 1.6.3
- C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密
- MyBatis两张表字段名相同产生的问题
- mongo 3.0 备份和还原数据库 ,及too many positional arguments错误
- AngularJs HTTP响应拦截器实现登陆、权限校验
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 解决Android8.0之后开启service
- 深入理解Java泛型(一.泛型的作用与定义)
- OpenCV与图像处理(九)
- 如何编写高质量的代码
- [数据结构与算法] 哈希表
- [数据结构与算法] 排序算法之直接插入排序与希尔排序
- [数据结构与算法] 排序算法之选择排序和堆排序
- [数据结构与算法] 树结构之二叉树
- [数据结构与算法] 排序算法之归并排序与基数排序
- [数据结构与算法] 邂逅数组与队列
- [数据结构与算法] 邂逅链表
- 【LeetCode每日一题】23. Merge k Sorted Lists
- MyBatis Generator( 逆向工程以及源码分析 )
- 虚拟机(Linux)常用命令
- Spring框架