当前位置: 首页 > news >正文

shopify独立站需要多少钱西安seo经理

shopify独立站需要多少钱,西安seo经理,给网站添加后台,西安做北郊做网站栈和队列 一、栈 概念与特性二、Stack 集合类及模拟实现1、Java集合中的 Stack2、Stack 模拟实现 三、栈、虚拟机栈、栈帧有什么区别?四、队列 概念与特性五、Queue集合类及模拟实现1、Queue的底层结构(1)顺序结构(2)链…

栈和队列

  • 一、栈 概念与特性
  • 二、Stack 集合类及模拟实现
    • 1、Java集合中的 Stack
    • 2、Stack 模拟实现
  • 三、栈、虚拟机栈、栈帧有什么区别?
  • 四、队列 概念与特性
  • 五、Queue集合类及模拟实现
    • 1、Queue的底层结构
      • (1)顺序结构
      • (2)链式结构
    • 2、Java集合中的 Queue
    • 3、Queue 模拟实现
  • 六、设计循环队列
    • 1、循环队列涉及的两个关键问题
      • (1)问题 1 解决方案
      • (2)问题 2 解决方案
    • 2、循环队列具体实现
  • 七、Deque 集合类

一、栈 概念与特性

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈
顶,另一端称为栈底。栈中的数据元素遵守后进先出 LIFO(Last In First Out)的原则。

二、Stack 集合类及模拟实现

1、Java集合中的 Stack

在这里插入图片描述

在Java集合中 Stack 集合类可以表示栈,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,因此Stack 底层维护的也是一个动态顺序表。

我们可以先看一下Stack中给出的常用方法:

构造方法

方法解释
Stack()构造一个空的栈

常用方法

方法功能
E push(E e)将元素 e 入栈,并返回 e
E pop()将栈顶元素出栈并返回
E peek()获取栈顶元素
int size()获取栈中有效元素个数
boolean empty()检测栈是否为空

2、Stack 模拟实现

有了顺序表和链表的基础,栈的实现就非常的简单了,下面就直接给出顺序栈的实现代码,大家可以参照注释进行理解:

public class MyStack {// 数组public int[] elem;// 栈顶public int top;// 构造方法(初始化顺序栈)public MyStack() {elem = new int[5];}//1.压栈:E push(E e) //检测容量private boolean isFull() {return top == elem.length;}public int push(int e) {if (isFull()) {// 如果栈满就扩容elem = Arrays.copyOf(elem,2*elem.length);}elem[top++]=e;return e;}//2.出栈:E pop() public int pop() {// 如果栈空,抛异常(这里可以自定义实现一个异常类)if (empty()) {throw new EmptyException("空栈!");}// 正常出栈return elem[--top];}//3.获取栈顶元素:E peek() public int peek() {return elem[top-1];}//4.获取栈中有效元素个数:int size() public int size() {return top;}//5.检测栈是否为空:boolean empty() public boolean empty() {return top == 0;}
}

上面实现的 栈 底层是一个动态数组,它的入栈和出栈都达到了O(1)。其实栈的底层也可以实现成链表的结构:

(1) 底层为单向链表。 如果底层维护一个单链表,那么可以将入栈实现为头插;出栈实现为头删;这样以来它的时间复杂的也可以达到O(1)。

(2)底层为双向链表。 对于双向链表来说,由于同时记录了head结点和last结点,并且每个结点的前后结点都是明确的,故无论是在头部使用插入删除模拟入栈出栈,还是在尾部实现,复杂度都可以达到O(1)。

这一点在Java集合类LinkedList中给出的接口方法中,得到了体现,它里面就提供了push()pop()peek()等方法。

三、栈、虚拟机栈、栈帧有什么区别?

  1. 栈是一种数据结构,用于存储和管理数据。
  2. 虚拟机栈是JVM在执行Java程序时使用的一块内存区域,包含了线程的栈帧。
  3. 栈帧是虚拟机栈中的一个元素,用于存储方法调用的信息。

四、队列 概念与特性

只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 的特点。

进行插入操作的一端称为队尾(Tail/Rear),进行删除操作的一端称为队头(Head/Front)

五、Queue集合类及模拟实现

1、Queue的底层结构

众所周知,无论是栈也好,队列也好,它们的本质都是一个容器,既然是容器那么底层就有两种结构:顺序结构、链式结构。那么队列的底层究竟是用 顺序结构还是链式结构?如果使用链式结构,那么是使用单向还是双向呢?下面我们一起来探讨一下:

(1)顺序结构

我们知道,队列的两个关键操作是,入队和出队。如果使用顺序结构,那么意味着它的底层将维护一个数组,此时我们有两种实现方案:

  • 方案一: 使用数组的头插完成入队,使用数组的尾删实现出队
  • 方案二: 使用数组的尾插完成入队,使用数组的头删实现出队

方案一分析:使用方案1,入队的话使用头插法,需要挪动数组元素,复杂度为O(N);出队的复杂度可以达到O(1)

方案二分析:使用方案2,入队复杂度可达到O(1),而出队,由于使用的头删,每次需要移动大量的元素,复杂度达到了O(N)。所以这两种方案均不能保证入队和出队的复杂度达到O(1),因此不建议采用。但是可通过循环数组,解决上述问题(后面讲解)

(2)链式结构

  • 方案一:使用单向链表。
  • 方案二:使用双向链表。

方案一分析:如果采用方案1使用单向链表,我们需要定义两个特殊结点 :头结点-head,尾结点-last。由于链表是单向的,所以如果此时我们采用头插表示入队,复杂度可达到O(1);尾删表示出队,由于链表是单向的,所以还需要找到 last 结点的前一个结点,复杂度达到了O(N)。所以需要使用尾插表示入队,复杂度可达到O(1);头删表示出队,复杂度也可达到O(1).

方案二分析:如果采用方案2使用双向链表。由于链表是双向的,所以 无论是将头插表示出队,尾删表示入队;还是尾插表示入队,头删表示出队都可以达到复杂度为O(1).

2、Java集合中的 Queue

并且在Java集合中的Queue接口底层实现的就是一个双向链表:

下面我们先查看一下Queue接口中一些常见的队列方法:

方法功能
boolean offer(E e)入队列,将元素插入队列尾部
E poll()出队列,移除并返回队头元素
E peek()获取队头元素,但不移除
int size()获取队列中有效元素的个数
boolean isEmpty()检测队列是否为空

3、Queue 模拟实现

同样根据上面给出的队列方法,下面就实现一个底层为双向链表的队列,大家可以参照上述实现思路和代码注释进行理解:

//原理:先进先出
//思路:双向链表头尾无所谓,下面采用[头插、尾删]代替[入队、出队]
public class DQueue {// 定义双向链表节点static class Node {public int val;public Node prev;public Node next;public Node(int val) {this.val = val;}}// 头结点public Node head;// 尾结点public Node last;// 队列长度public int size;//1.入队列:boolean offer(E e) 【头插】public boolean offer(int e) {Node node = new Node(e);// 判空if (isEmpty()) {head = node;last = node;} else {// 头插node.next = head;head.prev = node;head = head.prev;}size++;return true;}//2.出队列:E poll() 【尾删】public int poll() {// 判空if (isEmpty()) {// 这里可以自定义异常throw new EmptyException("队列为空!");}// 接收出队元素int ret = head.val;// 如果只有1个结点if (head.next == null) {last = null;head = null;} else {// 大于1个结点last.prev.next = null;last = last.prev;}size--;return ret;}//3.获取队头元素:int peek() public int peek() {// 判空if (isEmpty()) {// 这里可以自定义异常throw new EmptyException("队列为空!");}return head.val;}//4.获取队列中有效元素个数:int size() public int getSize() {return size;}//5.检测队列是否为空:boolean isEmpty() public boolean isEmpty() {return size == 0;}
}

六、设计循环队列

循环队列通过巧妙地利用数组的循环使用,解决了普通队列在头部插入和删除操作时效率低下的问题,使得offer()poll()操作均能够在O(1)的时间复杂度内完成。这种结构经常在 生产者消费者模型(敬请期待) 中使用。

1、循环队列涉及的两个关键问题

循环队列的设计主要涉及两个关键问题:

  1. 数组下标如何循环?
  2. 如何判断循环队列的空与满?

(1)问题 1 解决方案

方案一: headtail 使用加 1 取模操作。既保证当 head 和 tail 不处于数组尾下标时,加 1 取模操作不影响下标正常递增,又能保证 head 和 tail 处于数组尾下标时继续 入队 或 出队 下标循环。

方案二: 判断 tailhead 与 数组长度 nums.length 是否相等,相等则置 0 保证下标循环。

(2)问题 2 解决方案

方案一: 设置 usedSize 变量记录队列元素个数。usedSize 为 0 队列为空;usedSize 等于数组长度 nums.length 队列为满。

方案二: 牺牲 1 个数组元素。当 head 等于 tail 时表示队列为空;当 tail + 1 等于 head 时表示队列为满。

2、循环队列具体实现

解决了上面两个问题,下面的实现就是信手拈来。下面给出具体的实现代码,大家可以参照注释理解(判空 / 满 :这里采用 useSize;循环:使用 head / tail 与 nums.length 判断):

// 规定有效元素为:[head,tail)
// 判空判满使用:usedSize
// 下标循环使用:head / tail 与 nums.length 判断
public class CircularQueue {// 数组private int[] elem;// 队头private int head;// 队尾的下一个private int tail;// 有效元素个数private int usedSize;// 使用构造方法,初始化循环队列public CircularQueue(int k) {this.elem = new int[k];this.head = 0;this.tail = 0;this.usedSize = 0;}// 1.入队列:put()public boolean put(int val) {// 判满if (isFull()) {return false;}// 正常入队情况elem[tail ++] = val;// 增加有效元素个数usedSize ++;// 判断下标if (tail == elem.length) {tail = 0;}return true;}// 2.出队列:take()public int take() {// 判空if (isEmpty()) {throw new EmptyException("队列为空!");}// 正常出队情况int val = elem[head ++];// 减少有效元素个数usedSize --;// 判断下标if (head == elem.length) {head = 0;}return val;}// 3.获取队头元素:peekHead()public int peekHead() {// 判空if (isEmpty()) {throw new EmptyException("队列为空!");}int val = elem[head --];return val;}// 4.获取队尾元素:peekTail()public int peekTail() {// 判空if (isEmpty()) {throw new EmptyException("队列为空!");}// 由于 tail 指向最后一个有效元素的下一个,所以需要考虑下标边界情况int index = tail == 0? elem.length -1:tail -1;int val = elem[index];return val;}// 5.判空:isEmpty()public boolean isEmpty() {return usedSize == 0;}// 6.判满:isFull()public boolean isFull() {return usedSize == elem.length;}// 7.获取队列有效元素个数:getSize()public int getSize() {return usedSize;}
}

七、Deque 集合类

Deque表示一个双端队列,即允许两端都可以进行入队和出队操作的队列。

在Java集合框架中,Deque是一个接口,它实现了LinkedListArrayDeque,分别表示双端队列的线性实现 和 双端队列的链式实现。其中线性实现的底层为一个循环数组,链式实现的底层为一个双向链表。

在实际工程中,使用Deque接口是比较多的,Deque接口中涵盖了队列和栈的功能接口,实现栈和队列均可以使用该接口:

Deque<Integer> stack1 = new ArrayDeque<>();  // 线性实现
Deque<Integer> stack2 = new LinkedList<>();  // 链式实现Deque<Integer> queue1 = new ArrayDeque<>();  // 线性实现
Deque<Integer> queue2 = new LinkedList<>();  // 链式实现

文章转载自:
http://percher.c7622.cn
http://adventurer.c7622.cn
http://polysepalous.c7622.cn
http://sportsman.c7622.cn
http://copal.c7622.cn
http://panivorous.c7622.cn
http://flextime.c7622.cn
http://statuary.c7622.cn
http://leaky.c7622.cn
http://culpa.c7622.cn
http://judoman.c7622.cn
http://limpa.c7622.cn
http://pasteurella.c7622.cn
http://yaounde.c7622.cn
http://maniacal.c7622.cn
http://guildhall.c7622.cn
http://rostriform.c7622.cn
http://dextrorsely.c7622.cn
http://cosmos.c7622.cn
http://pictograph.c7622.cn
http://mystical.c7622.cn
http://trixie.c7622.cn
http://focalization.c7622.cn
http://trombonist.c7622.cn
http://swansdown.c7622.cn
http://fontinal.c7622.cn
http://opalesque.c7622.cn
http://archimandrite.c7622.cn
http://monogerm.c7622.cn
http://nj.c7622.cn
http://reverence.c7622.cn
http://shoyu.c7622.cn
http://kherson.c7622.cn
http://rugulose.c7622.cn
http://moondown.c7622.cn
http://encoop.c7622.cn
http://rongeur.c7622.cn
http://sclerotium.c7622.cn
http://congrats.c7622.cn
http://snye.c7622.cn
http://readership.c7622.cn
http://cephalate.c7622.cn
http://minification.c7622.cn
http://decapitation.c7622.cn
http://ridotto.c7622.cn
http://hose.c7622.cn
http://describing.c7622.cn
http://bedeswoman.c7622.cn
http://foretopmast.c7622.cn
http://workingwoman.c7622.cn
http://brisbane.c7622.cn
http://telecopter.c7622.cn
http://joro.c7622.cn
http://proximate.c7622.cn
http://annectent.c7622.cn
http://glycolipid.c7622.cn
http://anabaena.c7622.cn
http://extracorporeal.c7622.cn
http://pomegranate.c7622.cn
http://reconviction.c7622.cn
http://move.c7622.cn
http://salon.c7622.cn
http://inadaptability.c7622.cn
http://impedimentary.c7622.cn
http://enslavement.c7622.cn
http://xanthin.c7622.cn
http://arrhizal.c7622.cn
http://percale.c7622.cn
http://phlebitis.c7622.cn
http://esplanade.c7622.cn
http://cursillo.c7622.cn
http://torchon.c7622.cn
http://exuberance.c7622.cn
http://exenterate.c7622.cn
http://fadein.c7622.cn
http://aztecan.c7622.cn
http://thessalonians.c7622.cn
http://viridin.c7622.cn
http://omniscience.c7622.cn
http://monophagia.c7622.cn
http://dentilingual.c7622.cn
http://variorum.c7622.cn
http://recuperator.c7622.cn
http://jazzman.c7622.cn
http://completive.c7622.cn
http://menstrual.c7622.cn
http://reconsignment.c7622.cn
http://ganglionectomy.c7622.cn
http://ultimatistic.c7622.cn
http://motley.c7622.cn
http://pallia.c7622.cn
http://smidgeon.c7622.cn
http://vasoconstrictor.c7622.cn
http://pithos.c7622.cn
http://far.c7622.cn
http://raft.c7622.cn
http://mlw.c7622.cn
http://philibeg.c7622.cn
http://alabaster.c7622.cn
http://ethionamide.c7622.cn
http://www.zhongyajixie.com/news/74932.html

相关文章:

  • ps网站参考线怎么做友情链接的作用大不大
  • 如何采集网站文章怎么开一个网站平台
  • 竹制品网站怎么做成人短期就业培训班
  • vs2013做的网站怎样注册网站建立网页
  • 郑州东站附近网站建设公司百度公司简介介绍
  • 建网站多少钱建个网站需要怎么做关键词推广哪家好
  • 郑州市招投标信息网吴中seo页面优化推广
  • 大亚湾建设局网站关键词优化怎么弄
  • 甘肃网站制作公司91手机用哪个浏览器
  • 南宁手机平台网站建设南京百度网站推广
  • 环境设计排版哪个网站好宁波网络推广运营公司电话
  • 生活服务手机网站开发海洋seo
  • 用易语言做钓鱼网站免费的网络推广渠道有哪些
  • 不知此网站枉做男人的网站手机自动排名次的软件
  • 怎么在百度提交网站百度搜索下载
  • 电子商务网站租用服务器费用知乎seo
  • 建设博客网站步骤外包网络推广公司推广网站
  • 荔浦网站开发地推任务网
  • 做企业网站用哪个cms互联网广告代理加盟
  • 武汉wordpress建站提高网站排名的软件
  • 成都网页制作服务好电脑系统优化软件排行榜
  • 做网站用哪种代码比较好推广seo做得比较好的企业案例
  • 国外建设网站用的是什么软件宁波如何做seo排名优化
  • 有学做美食的网站吗世界十大搜索引擎排名
  • 手机触屏网站模板看b站视频下载软件
  • 相册管理网站模板下载网络整合营销理论案例
  • 长春网站开发报价企业网站建设优化
  • 嘉兴做网站哪家好网站优化排名易下拉系统
  • 网站添加手机站独立站优化
  • 哪个网站做外贸比较好全媒体运营师培训费用