数据结构 --栈和队链

一.栈的概念

一种特殊的线性表,只能从固定的一端插入和删除元素。

栈中元素遵循先进后出的原则。

二.模拟实现

public class MyStack {public int size;public int[] array;public  MyStack(){array =new int[10];}private void grow(){array = Arrays.copyOf(array,array.length*2);}public int size(){return size;}private boolean isFull(){return size==array.length;}public Boolean empty(){return size==0;}public void push(int data){if (isFull()){grow();}array[size]=data;size++;}public int pop(){if (empty()){return -1;}return array[--size];}public int peek(){if (empty()){return -1;}return array[size-1];}
}

注意:

该模拟实现底层是靠数组,除了数值,还可以用链表

单向链表:

采用尾插法时,push和pop时间复杂度为O (n), 原因是压栈时要遍历链表到尾部压栈,如果在尾部定义一个尾节点时 时间复杂度为O (1)。出栈时后进先出,尾部最后进,要遍历到倒数第二个节点,才能删除尾节点。

采用首插法时,push和pop时间复杂度都为O (1),原因是遍历链表时出栈时,刚好遵循先进后出的原则。

双向链表:

无论是尾插法还是首插法,push和pop时间复杂度为O (1).

三.栈的方法

四.中缀表达式转后缀表达式

五.栈的使用

1.逆序打印链表

 public boolean isValid(String s) {Stack<Character> stack1 =new Stack<>();for(int i=0;i<s.length();i++){char ch =s.charAt(i);if(ch=='('||ch=='{'||ch=='['){stack1.push(ch);}else{//字符串没遍历完的情况if(stack1.empty()){return false;}//比较相不相等if(stack1.peek()=='(' && ch==')'||stack1.peek()=='{'&&ch=='}'||stack1.peek()=='['&&ch==']'){stack1.pop();   //相等就弹出一个字符}else{return false; }}}//栈中有剩余的情况if(stack1.empty()){return true;}else{return false;}}

2.逆波兰表达式求值

    public int evalRPN(String[] tokens) {Stack<Integer> stack =new Stack<>();int sum =0;for(int i=0;i<tokens.length;i++){if(tokens[i].equals("+")||tokens[i].equals("-")||tokens[i].equals("*")||tokens[i].equals("/")){int val2=stack.pop();int val1=stack.pop();switch(tokens[i]){case "+" :sum=val1+val2;break;case "-" :sum=val1-val2;break;     case "*" :sum=val1*val2;break;     case "/" :sum=val1/val2;break;}stack.push(sum);}else{stack.push(Integer.valueOf(tokens[i]));}}return stack.pop();}

3.最小栈

class MinStack {public Stack<Integer> stack1;public Stack<Integer> stack2;public MinStack() {stack1 =new Stack<>();stack2 =new Stack<>();}public void push(int val) {stack1.push(val);if(stack2.empty()||val<=stack2.peek()){stack2.push(val);}}public void pop() {if(stack1.empty()){return;}if(stack1.peek().equals(stack2.peek())){  stack1.pop();stack2.pop();}else{stack1.pop();}}public int top() {if(stack1.empty()){    return -1;}return stack1.peek();}public int getMin() {if(stack1.empty()){return -1;}return stack2.peek();}
}

注意:

其中的pop方法必须用equals来进行比较,因为是Integer类型,范围较小,超出范围时会创建新对象存储值,用 == 去比较时就是比的是地址

六.队列的模拟实现

采用先进先出的原则。

用数组实现不行,原因如下:

所以采用单向链表或双向链表

单向链表:

采用头差法,push时间复杂度为O (1)和pop时间复杂度为为O (n),因为尾部元素为最先进的元素,得遍历到倒数第二个节点才能删除

采用尾插法,在定义一个尾节点,push和pop时间复杂度和空间复杂度为O (1)

双向链表:

俩种都可以

模拟实现:

public class MyQueue {class ListNode{public int val;public ListNode next;public ListNode pre;public ListNode(int val) {this.val = val;}}private ListNode head;private ListNode last;private int size;public int size(){return size;}public boolean isEmpty(){return size==0;}public void offer(int value){ListNode node =new ListNode(value);if (head==null){head=last=node;}else {last.next=node;node.pre=last;last=last.next;}size++;}public int poll(){if (isEmpty()){return -1;}int ret=0;if(head.next==null){ret =head.val;head=last=null;}else {ret =head.val;head=head.next;head.pre=null;}size--;return ret;}public int peek(){if (isEmpty()){return -1;}return head.val;}

七.循环队列

1.保留一个位置

class MyCircularQueue {public int[] array;public int front;public int rear;public MyCircularQueue(int k) {array =new int[k+1];}public boolean enQueue(int value) {if(isFull()){return false;}array[rear] =value;rear=(rear+1)%array.length;return true;}public boolean deQueue() {if(isEmpty()){return false;}front=(front+1)%array.length;return true;}public int Front() {if(isEmpty()){return -1;}return array[front];}public int Rear() {if(isEmpty()){return -1;}return array[(rear-1+array.length)%array.length];}public boolean isEmpty() {return rear==front;}public boolean isFull() {return (rear+1)%array.length==front;}
}

除此之外,还可以通过size记录元素数量来判断队列是否满了或空的

八.双端队列(Deque)

双端队列(Deque)是指允许两端都可以进行入队和出队操作的队列,那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90054.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文档处理控件TX Text Control系列教程:使用 C# .NET 将二维码添加到 PDF 文档

PDF 文档通常是合同、发票、证书和报告的最终格式。尽管它们在设计上是静态的&#xff0c;但用户现在希望能够与它们交互、验证信息并直接从这些文件访问数字服务。这时&#xff0c;二维码就变得至关重要。 PDF 文档中的二维码将印刷或数字内容与动态在线体验连接起来。用户只需…

Google Chrome 谷歌浏览器全部版本集合

Google Chrome 谷歌浏览器全部版本集合 Collection of all software versions of Google Chrome. 项目介绍 本项目为Google Chrome谷歌浏览器的全部版本集合&#xff0c;方便大家下载旧版本使用。 因为Gitee项目限制仓库1G大小&#xff0c;所以许多谷歌浏览器版本无法上传。…

论文略读:Towards Safer Large Language Models through Machine Unlearning

ACL 2024大型语言模型&#xff08;LLMs&#xff09;的迅猛发展展现了其在多个领域的巨大潜力&#xff0c;这主要得益于其广泛的预训练知识和出色的泛化能力。然而&#xff0c;当面对问题性提示&#xff08;problematic prompts&#xff09;时&#xff0c;LLMs 仍然容易生成有害…

深度学习 ---参数初始化以及损失函数

深度学习 —参数初始化以及损失函数 文章目录深度学习 ---参数初始化以及损失函数一&#xff0c;参数初始化1.1 固定值初始化1.1.1 全0初始化1.1.2 全1初始化1.3 任意常数初始化1.2 随机初始化一&#xff0c;参数初始化 神经网络的参数初始化是训练深度学习模型的关键步骤之一…

JS--M端事件

移动端&#xff08;Mobile 端&#xff0c;简称 M 端&#xff09;开发中&#xff0c;由于设备特性&#xff08;触摸屏、手势操作等&#xff09;&#xff0c;需要处理一些与桌面端不同的事件。这些事件主要针对触摸交互、手势识别等场景 一、触摸事件&#xff08;Touch Events&am…

Linux网络编程-tcp

tcp、udp对比&#xff1a;UDP1. 特点无连接&#xff1a;无需建立连接即可发送数据。不可靠&#xff1a;不保证数据顺序或完整性。低延迟&#xff1a;适合实时性要求高的场景。2. 应用场景视频/音频流传输&#xff08;如直播&#xff09;。DNS 查询、在线游戏。TCP1. 特点面向连…

记一次flink资源使用优化

一.现状分析 现有任务的资源配置如下&#xff0c;根据ui监控中Garbage Collection可以发现&#xff0c;此任务频繁的发生GC&#xff0c;且老年代GC时间较久二.整体memory使用分析如下Framework Heap&#xff08;框架堆内存&#xff09;用于Flink框架自身的堆内存&#xff08;如…

Vue底层换成啥了?如何更新DOM的?

摘要&#xff1a;之前的vue是使用虚拟 DOM的&#xff0c;但是Vue 3.6 带来了一个意义重大的更新&#xff1a; Vapor Mode 渲染模式。Vue 渲染策略的演进&#xff1a; Vue 1.x&#xff1a; 基于模板渲染策略&#xff0c;直接将模板转换为DOM元素&#xff0c;并为每个DOM元素创建…

0722 数据结构顺序表

Part 1.顺序表的代码一.顺序表的内存申请head.h: typedef int datatype;typedef struct sqlist {//数据元素datatype data[MAXSIZE];//顺序表长度int len;}*sqlist; //*sqlist的作用: //sqlist:struct Sqlist * sqlist create();head.c: sqlist create() {sqlist list (sqlist)…

为何在 Vue 的 v-model 指令中不能使用可选链(Optional Chaining)?

Vue 的 v-model 是实现组件与数据双向绑定的核心指令之一&#xff0c;它本质上是一个语法糖&#xff0c;用于简化对表单元素和组件 props 的同步更新。然而&#xff0c;在 Vue 3&#xff08;以及 Vue 2 的某些模式下&#xff09;&#xff0c;开发者尝试在 v-model 中使用 JavaS…

基于单片机智能药盒/智能药箱/定时吃药系统

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 本设计实现了一种基于单片机的智能药盒&#xff0c;系统以微控制器&#xff08;如STM32&#xff…

(25)python+playwright自动化处理单选和多选按钮-中

1.简介上一篇中讲解和介绍的单选框有点多&#xff0c;而且由于时间的关系&#xff0c;决定今天讲解和分享复选框的相关知识。2.什么是单选框、复选框&#xff1f;单选按钮一般叫raido button&#xff0c;就像我们在电子版的单选答题过程一样&#xff0c;单选只能点击一次&#…

Nginx IP授权页面实现步骤

目标&#xff1a;一、创建白名单文件sudo mkdir -p /usr/local/nginx/conf/whitelist sudo touch /usr/local/nginx/conf/whitelist/temporary.conf二、创建Python认证服务文件路径&#xff1a;/opt/script/auth_server.pyimport os import time from flask import Flask, requ…

2025年7月中科院一区-向光生长优化算法Phototropic growth algorithm-附Matlab免费代码

引言 本期介绍一种新的元启发式算法——向光生长优化算法Phototropic growth algorithm&#xff0c;PGA。灵感来自植物细胞在阳光下的生长模式。于2025年7月最新发表在JCR 1区&#xff0c;中科院1区 SCI 期刊 Knowledge-Based Systems。 该算法将生物学启发的确定性生长行为与…

poi-excel-添加水印

1、官网快速指南 https://poi.apache.org/components/spreadsheet/quick-guide.html 访问如上地址可以查看到poi的相关操作方式&#xff1a; How to create a new workbookHow to create a sheetHow to create cellsHow to create date cellsWorking with different types of…

STM32 开发的鼠标:技术详解与实现指南

概述基于STM32微控制器开发的鼠标是一种高度可定化的输入设备解决方案&#xff0c;广泛应用于工业控制、嵌入式系统、特殊人机交互等领域。相比传统鼠标&#xff0c;STM32鼠标具有以下优势&#xff1a;高度可定制性&#xff1a;可添加特殊功能按键、传感器集成低功耗设计&#…

GoLang教程007:打印空心金字塔

4.6 案例一&#xff1a;打印金字塔编写一个程序&#xff0c;可以接收一个整数&#xff0c;表示层数&#xff0c;打印出金字塔。1️⃣第一步&#xff1a;打印一个矩形 package mainimport "fmt"func main() {// i表示层数for i : 1; i < 3; i {// j表示每层打印多少…

iOS开发 Swift 速记3:运算符与控制结构

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

ElasticSearch中需要注意的点,附官方文档解读

1.批量更新数量大小限制 https://www.elastic.co/guide/cn/elasticsearch/guide/current/bulk.html#_How_Big_Is_Too_Big 整个批量请求都需要由接收到请求的节点加载到内存中&#xff0c;因此该请求越大&#xff0c;其他请求所能获得的内存就越少。批量请求的大小有一个最佳值…

Git GitHub精通:前端协作开发的“瑞士军刀“!

前言&#xff1a;为什么你的代码总是"失踪"&#xff1f; "啊&#xff01;我的代码呢&#xff1f;"——这可能是每个程序员都曾发出过的灵魂呐喊。还记得上周我熬夜写的300行JavaScript&#xff0c;第二天醒来发现被自己手贱覆盖了&#xff0c;那一刻我深刻…