不理解栈和队列?知道子弹上膛和火车穿隧道就好
栈和队列
栈(Stack)
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈
顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶
. 利用顺序表实现,即使用尾插 + 尾删的方式实现
- 利用链表实现,则头尾皆可
相对来说,顺序表的实现上要更为简单一些,所以我们优先用顺序表实现栈。
public class MyStack {
// 简单起见,我们就不考虑扩容问题了
private int[] array = new int[100];
private int size = 0;
public void push(int v) {
array[size++] = v;
}
public int pop() {
return array[–size];
public int peek() {
return array[size - 1];
}
public boolean isEmpty() {
return size == 0;
}
public int size() {
return size;
}
}
队列(Queue)
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First
In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头
(Head/Front)
实现
class Node {int val;
Node next;
Node(int val, Node next) {this.val = val;
this.next = next;
}
Node(int val) {this(val, null);
}
}
public class MyQueue {private Node head = null;
private Node tail = null;
private int size = 0;
public void offer(int v) {Node node = new Node(v);
if (tail == null) {head = node;
} else {tail.next = node;
}
tail = node;
size++;
}
public int poll() {if (size == 0) {throw new RuntimeException("队列为空");
}
Node oldHead = head;
head = head.next;
if (head == null) {tail = null;
}
size--;
return oldHead.val;
}
public int peek() {if (size == 0) {throw new RuntimeException("队列为空");
}
return head.val;
}
public boolean isEmpty() {return size == 0;
}
public int size() {return size;
}
}
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上
出数据,效率会比较低
循环队列
实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。
环形队列通常使用数组实现
数组下标循环的小技巧
下标最后再往后(offset 小于 array.length):
index = (index + offset) % array.length
下标最前再往前(offset 小于 array.length):
index = (index + array.length - offset) % array.length
如何区分空与满
1. 通过添加 size 属性记录
2. 保留一个位置
双端队列 (Deque)
概念
双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。
那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。
Stack
方法 解释
E push(E item) … 压栈
E pop() … 出栈
E peek() …查看栈顶元素
boolean empty() … 判断栈是否为空
Queue
错误处理// / 抛出异常 /// 返回特殊值
入队列 add(e) // offer(e)
出队列 remove() / poll()
队首元素 /element() peek()
不理解栈和队列?知道子弹上膛和火车穿隧道就好相关推荐
- 【剑指offer - C++/Java】5、用两个栈实现队列
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 牛客网题目链接:用两个栈实现队列 文章目录 1.题目分析 2.代码 ...
- 剑指Offer的学习笔记(C#篇)-- 用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 一 . 概念! 首先要理解栈和队列的概念. 1. 栈:咱可以简单的把栈理解成装羽毛球的球桶.或者我们吃的 ...
- java 栈队列区别是什么意思_java栈和队列的区别
Java中用LinkedList实现栈和队列_IT/计算机_专业资料.笔记摘录 栈和队列是两种特殊的线性表,它们的逻辑结构和线性表相同,只是其运算规则 较线性表有更多的限制,故...... 闽江学院电 ...
- 图解数据结构:栈和队列
前言 阅读此篇之前,强烈建议先仔细阅读上一篇 图解数据结构:数组和单链表 ,会有事半功倍的效果,并且此篇的代码,基本上是复用上一篇的实现. 上一篇主要讲解了数组和链表这两种线性结构的特点.区别.时间复 ...
- C语言数据结构【手抄版】第三章 栈和队列
注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 注意:文中彩色代码均在Visual Studio 2022编译器中编 ...
- 数据结构栈与队列的应用之汽车轮渡问题——自己的一些理解
本题摘自王道数据结构栈与队列的应用的课后题,题目如下: 某汽车轮渡口,过江渡船每次能载10辆汽车过江.过江车辆分为客车类和货车类,上渡船有如下规定:同类车先到先上船,客车先于货车上船,且每上4辆客车, ...
- 数据结构中堆、栈和队列的理解
一.堆 堆是一种经过排序的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构是指二叉树.所以堆在数据结构中通常可以被看做是一棵树的数组对象.而且堆需要满足一下两个性质: (1)堆中某个节点的 ...
- 保存数组_面试官:讲一讲你对据结构——数组、链表、栈、队列的理解
一.解释定义 1. 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.再简单描述一下:数据结构就是描述对象间逻辑关系的学科. 如果还是不太清楚下面会举例说明的. 2. 数据存储结 ...
- 《大话数据结构》读书笔记-栈与队列
写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 4.2栈的定义 4.2.1 栈的定义 4.2.2 进栈出栈变 ...
最新文章
- 通过仿真和综合认识D触发器(Verilog HDL语言描述D触发器)
- intelij idea java.lang.ClassNotFoundException
- IOS Masonry自动布局
- 清空mysql注册表步骤_完全卸载MySQL 数据库清空MySql注册表
- python做Linux进程运行,Python实现在Linux系统下更改当前进程运行用户
- cad打印字体颜色很淡_收藏|50个CAD技巧,常画电路图的你一定得知道
- 浅谈php7的重大新特性_PHP7的新特性和源码结构
- mysql自带加密解密字符集问题
- js中报错 ajax不存在,AJAX
- 有人问我:Linux下命令行里 password:的时候 用键盘密码打不了
- Python学习之路9☞面向对象的程序设计
- anylogic和java_Anylogic各个版本的功能对比
- PCB设计经典资料学习汇总
- Xcode6 中URL Scheme的具体使用
- workman定时器使用
- 液晶显示器画面模糊有毛边解决方法
- 名帖337 张旭 草书《古诗四帖》
- 安装PS 无法选择路径
- mosquitto使用的基本流程以及一些遇见的问题
- 专题三:羊毛党络绎不绝,电商行业防不胜防