学习笔记:数据结构栈和队列
时间:2021-08-01
本文章向大家介绍学习笔记:数据结构栈和队列,主要包括学习笔记:数据结构栈和队列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、栈和队列的共同点
栈和队列主要作为程序员构思算法的工具,不是完全的数据存储工具,生命周期比持久型的数据结构短,只有程序执行操作期间才被创建,程序执行完成,就会销毁。
特性是受限访问,即不能像数组那样直接通过下标访问元素,也不能像链表那样顺序遍历访问数据项,特定时刻只能有一个元素被访问或删除。
二、栈
1.特性
栈只允许访问一个数据项:最后插入的数据项。只有移除这个数据项才能访问倒数第二个被插入的数据项。
2.数组实现栈
简单的实现一下栈(用数组),创建、入栈、出栈、查看栈顶等方法。
public class ArrayStack {
//底层是数组,创建时要声明数组大小
int[] array;
int maxSize = 10;
//维护一个指针访问栈顶元素,数组就是下标数字
int top;
public ArrayStack() {
array = new int[maxSize];
top = -1;
}
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
array = new int[maxSize];
top = -1;
}
//判断是否空栈
public boolean isEmpty() {
return top == -1;
}
//判断是否满栈
public boolean isFull() {
return top == this.maxSize - 1;
}
//入栈
public void push(int data) {
if (!isFull()){
array[++top] = data;
}
}
//出栈,返回栈顶元素
public int pop() {
if (!isEmpty()) {
return array[top--];
}
return 0;
}
//查看栈顶元素
public int peek() {
return array[top];
}
}
测试一下:
public class StackTest {
@Test
public void testArrayStack() {
ArrayStack stack = new ArrayStack(10);
//入栈
stack.push(14);
stack.push(23);
stack.push(65);
stack.push(12);
//出栈
System.out.println("出栈元素: "+ stack.pop());
System.out.println("出栈元素: "+ stack.pop());
//查看栈顶元素
System.out.println("栈顶元素: "+ stack.peek());
}
}
运行结果:
出栈元素: 12
出栈元素: 65
栈顶元素: 23
push()
入栈方法中将top值加一,指向原来数据项顶端上面的一个位置,并在这位置上存储一个数据项。
pop()
出栈方法返回top标识的数据项,然后再减一。尽管数据项仍在数组中,但是不能访问了,直到新元素压入栈中覆盖这个数据项
peek()
就是访问top指向的数据项,不修改栈。
3.栈的效率
入栈和出栈时间复杂度O(1);
二、队列
1.概述
队列也是一种数据结构,和栈类似,不过队列中的第一个插入的元素会最先被移除。
队列的常见操作时创建和入队、出队、查看队首方法。
public class ArrayQueue {
//数组实现队列,需要声明大小
int maxSize = 10;
int[] array;
//声明队头指针
int front;
//声明队尾指针
int near;
//记录元素个数
int num;
public ArrayQueue() {
array = new int[maxSize];
front = 0;
near = -1;
num = 0;
}
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
array = new int[maxSize];
front = 0;
near = -1;
num = 0;
}
//判断非空
public boolean isEmpty() {
return num == 0;
}
//判断是否满
public boolean isFull() {
return num == maxSize;
}
//入队
public void insert(int data) {
if (!isFull()) {
if (near == maxSize - 1) { //循环队列
near = -1;
}
array[++near] = data;
num++;
}
}
//出队
public int remove() {
if (isEmpty()) {
return -1;
}
int temp = array[front];
if (front == maxSize -1) {
front = -1;
}
front++;
num--;
return temp;
}
//查看队首元素
public int peekFront() {
return array[front];
}
//队列数据项数量
public int size() {
return num;
}
}
测试代码:
public class QueueTest {
@Test
public void testArrayQueue() {
ArrayQueue arrayQueue = new ArrayQueue();
//测试入队方法
arrayQueue.insert(23);
arrayQueue.insert(230);
arrayQueue.insert(2300);
arrayQueue.insert(23000);
//查看队首元素
System.out.println("队首元素: "+arrayQueue.peekFront());;
//测试出队方法
System.out.println("出队元素: "+arrayQueue.remove());
System.out.println("队首元素: "+arrayQueue.peekFront());;
System.out.println("出队元素: "+arrayQueue.remove());
System.out.println("队首元素: "+arrayQueue.peekFront());;
System.out.println("元素个数:" +arrayQueue.size());
}
}
运行结果:
队首元素: 23
出队元素: 23
队首元素: 230
出队元素: 230
队首元素: 2300
元素个数:2
2.队列的效率
队列效率和栈一样,入队和出队时间复杂度都是O(1);
3.优先级队列
优先级和队列和普通队列一样,也是有队首和队尾,不过优先级队列数据项按照关键字的值有序。
public class PriorityQueue {
//数组实现队列,需要声明大小
int maxSize = 10;
int[] array;
//记录元素个数
int num;
public PriorityQueue() {
array = new int[maxSize];
num = 0;
}
public PriorityQueue(int maxSize) {
this.maxSize = maxSize;
array = new int[maxSize];
num = 0;
}
//判断非空
public boolean isEmpty() {
return num == 0;
}
//判断是否满
public boolean isFull() {
return num == maxSize;
}
//入队
public boolean insert(int data) {
if (isFull()) {
return false;
}
if (isEmpty()) {
array[num++] = data;
return true;
} else {
int i;
for ( i = num - 1; i >= 0; i --) {
if (array[i] < data) {
array[i+1] = array[i];
} else {
break;
}
}
array[i+1] = data;
num++;
return true;
}
}
//出队
public int remove() {
if (isEmpty()) {
return -1;
} else {
return array[--num];
}
}
//查看优先级最小的元素
public int peekMin() {
return array[num-1];
}
//队列数据项数量
public int size() {
return num;
}
}
测试代码:
@Test
public void testPriorityQueue() {
PriorityQueue priorityQueue = new PriorityQueue();
//入队
priorityQueue.insert(78);
priorityQueue.insert(32);
priorityQueue.insert(2);
priorityQueue.insert(788);
System.out.println("元素个数:" + priorityQueue.size());
//出队
System.out.println("出队元素: "+ priorityQueue.remove());
System.out.println("优先级最小的元素: "+ priorityQueue.peekMin());
System.out.println("出队元素: "+ priorityQueue.remove());
System.out.println("优先级最小的元素: "+ priorityQueue.peekMin());
System.out.println("元素个数:" + priorityQueue.size());
//查看队尾元素
System.out.println("优先级最小的元素: "+ priorityQueue.peekMin());
}
运行结果:
元素个数:4
出队元素: 2
优先级最小的元素: 32
出队元素: 32
优先级最小的元素: 78
元素个数:2
优先级最小的元素: 78
优先级队列的效率:插入的时间复杂度是O(n),删除的效率是O(1)
原文地址:https://www.cnblogs.com/echoxiatiandefeng/p/15085348.html
- 【译】Spring官方教程:Spring Boot整合消息中间件RabbitMQ
- [实录]解决Migrator.Net 小bug
- Jenkins Pipeline插件十大最佳实践!
- Spring Cloud Hystrix的请求合并
- JQuery JCshare 0.1 分享插件
- Java中的即时编译(Just-in-time compilation)
- 无尽的忙碌换来幸福的日子
- 消费者驱动的微服务契约测试套件:Spring Cloud Contract
- 自己做的一个小程序 可采集、导出、模板、配置
- 分布式消息队列 RocketMQ 源码分析 —— Message 拉取与消费(上)
- .NET反射、委托技术与设计模式
- 我最常用的Intellij IDEA快捷键
- 用Js控制TextBox不能复制粘贴
- 漫画:什么是单例模式?(整合版)
- 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 数组属性和方法
- Android 中Failed to read key from keystore解决办法
- Android圆角按钮的制作方法
- Android计时器控件Chronometer应用实例
- Android 中利用 ksoap2 调用 WebService的示例代码
- Android自定义View展示Wifi信号强弱指示方法示例
- android事件分发机制的实现原理
- Android 在子线程中更新UI的几种方法示例
- WebView设置WebViewClient的方法
- Android星级评分条的实现代码
- Android模仿美团顶部的滑动菜单实例代码
- android实现按钮获取焦点延迟加载
- Devtools 老师傅养成[1] - Chrome Devtools介绍
- Android4.4开发之电池低电量告警提示原理与实现方法分析
- 浅谈android性能优化之启动过程(冷启动和热启动)
- Android拖动条的实现代码