栈(Stack)与队列(Queue,Deque)

前言:

栈与队列在数据结构中用法都相对比较简单,是数据结构中经常用到的两种。

1.栈(Stack)

(1)特点:

 先入后出,后入先出。栈的底层就是一个数组(java原生库中),通过对数组的操作来实现栈的相关操作。栈也是可以用链表(LinkedList)来实现的,在LinkedList这个类中也有push,pop,peek等方法,足以说明栈可以用LinkedList来实现。栈继承了Vector类(这个类中也有一个判空的方法isEmpty() ),可以使用在这个类中的所有非私用方法。

(2)方法:

这里push,pop,empty时间和空间复杂度都为O(1)。 empty判空是定义了一个变量,用来计数。

(3)OJ题:

1)逆波兰表达式求值:

题析:

题解:

import java.util.Stack;
class Solution {public boolean isOperation(String x) {if(x.equals("+") | x.equals("-") | x.equals("*") | x.equals("/")) {return false;}return true;}public int evalRPN(String[] tokens) {Stack<String> stack = new Stack<>();for(String x : tokens) {if(!isOperation(x)) {//如果不是数字int num1 = Integer.parseInt(stack.pop()); //栈顶元素 => 放在右边int num2 = Integer.parseInt(stack.pop()); //栈顶后面一个元素 => 放在左边switch(x) {case "+":stack.push(String.valueOf((num2 + num1)));break;case "-":stack.push(String.valueOf((num2 - num1)));break;case "*":stack.push(String.valueOf((num2 * num1)));break;case "/":stack.push(String.valueOf((num2 / num1)));break;default:break;}}else {stack.push(x);}}return Integer.parseInt(stack.peek());}
}

2)括号匹配: 

题析:

题解:

import java.util.Stack;
class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();char[] arr = s.toCharArray();for(char x : arr) {if(stack.empty()){stack.push(x);}else {if(stack.peek() == '(' && x == ')' || stack.peek() == '{' && x == '}' || stack.peek() == '[' && x == ']') {stack.pop();}else {stack.push(x);}}}return stack.empty();}
}

3)出栈入栈次序匹配:

题析:

题解:

public class Solution {public boolean IsPopOrder (int[] pushV, int[] popV) {Stack<Integer> stack = new Stack<>();int j = 0;for(int i = 0; i < pushV.length; i++) {stack.push(pushV[i]);while(!stack.isEmpty() && j < popV.length && stack.peek() == popV[j]) {stack.pop();j++;}}if(!stack.isEmpty()) {return false;}return true;}
}

2.队列

队列分为单端队列(Queue)和双端队列(Deque),都是接口,都有先入先出,后入后出的特点。

2.1 单端队列(Queue)

(1)特点:

只有一端可以入,一端可以出。Queue可以用线性表(循环队列),也可以用链表(LinkedList)来实现。

(2)方法:

主要的方法就这三种。需要注意的是这里面Queue接口中没有empty()方法,但由于它是继承了Vector类,所以可以使用isEmpty()方法来判断是否Queue为空。

(3)OJ题:

1)设计循环队列:

题析:

题解:

//法一:设置一个计数变量:count
class MyCircularQueue {//循环队列的底层就是一个数组public int[] arr;//队头public int front;//队尾public int tail;//计数public int count;public MyCircularQueue(int k) {arr = new int[k];}public boolean enQueue(int value) {if(isFull()) {//队列已满return false;}if(tail == arr.length) {tail = 0;}arr[tail] = value;tail++;count++;return true;}public boolean deQueue() {if(isEmpty()) {return false;}front++;if(front == arr.length) {front = 0;}count--;return true;}public int Front() {if(isEmpty()) {return -1;}return arr[front];}public int Rear() {if(isEmpty()) {return -1;}if(isFull()) {}int index = (tail == 0) ? 0 : (tail - 1); return arr[index];}public boolean isEmpty() {return count == 0;}public boolean isFull() {return count == arr.length;}
}
//法二:浪费一个空间
class MyCircularQueue {//循环队列的底层就是一个数组public int[] arr;//队头public int front;//队尾public int tail;public MyCircularQueue(int k) {arr = new int[k + 1];}public boolean enQueue(int value) {if(isFull()) {//队列已满return false;}arr[tail] = value;tail = (tail + 1) % arr.length;return true;}public boolean deQueue() {if(isEmpty()) {return false;}front = (front + 1) % arr.length;return true;}public int Front() {if(isEmpty()) {return -1;}return arr[front];}public int Rear() {if(isEmpty()) {return -1;}int index = (tail == 0) ? (arr.length - 1) : (tail - 1); return arr[index];}public boolean isEmpty() {return tail == front;}public boolean isFull() {return (tail + 1) % arr.length == front;}
}

浪费一个空间的这种写法: 

题中给的示列:

而按我们这种这里的写法: 如果设置长度为3,那么只能放两个元素,所以需要将数组的长度设置为4就能放三个元素了,也就是数组长度设置为k + 1。

 2.2 双端队列

(1)特点:

两端都可以入队出队。Deque可以用线性表(循环队列),也可以用链表(LinkedList)来实现。

(2)方法:

与单端队列的方法都大同小异。 

3.栈与队列相关的OJ题

(1)用栈实现队列

题析:

题解:

class MyQueue {Stack<Integer> stack1;Stack<Integer> stack2;public MyQueue() {stack1 = new Stack<>();stack2 = new Stack<>();}public void push(int x) {stack1.push(x);}public int pop() {if(stack2.isEmpty()) {while(!stack1.isEmpty()) {stack2.push(stack1.pop());}}return stack2.pop();}public int peek() {if(stack2.isEmpty()) {while(!stack1.isEmpty()) {stack2.push(stack1.pop());}}return stack2.peek();}public boolean empty() {return stack1.isEmpty() && stack2.isEmpty();}
}

(2)用队列实现栈:

题析:

题解:

class MyStack {Queue<Integer> queue1;Queue<Integer> queue2;public MyStack() {queue1 = new ArrayDeque<>();queue2 = new ArrayDeque<>();}public void push(int x) {if(!queue1.isEmpty()) {queue1.offer(x);}else if(!queue2.isEmpty()) {queue2.offer(x);}else {//两个都为空,指定放在queue1中queue1.offer(x);}}public int pop() {if(empty()) {return -1;}int i = 0;if(!queue1.isEmpty()) {int size = queue1.size();for(i = 0; i < size- 1; i++) {queue2.offer(queue1.poll());}return queue1.poll();}else {int size = queue2.size();for(i = 0; i < size- 1; i++) {queue1.offer(queue2.poll());}return  queue2.poll();}}public int top() {int i = 0;if(!queue1.isEmpty()) {int size = queue1.size();int x = -1;for(i = 0; i < size; i++) {x = queue1.poll();queue2.offer(x);}return x;}else {int size = queue2.size();int x = -1;for(i = 0; i < size; i++) {x = queue2.poll();queue1.offer(x);}return  x;}}public boolean empty() {//两个队列均为空的时候才能判断该栈为空return queue1.isEmpty() && queue2.isEmpty();}
}

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

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

相关文章

在PyQt中为自己开发的软件实现远程文件“一机一码”授权管理实例

在使用PyQt搞软件开发时&#xff0c;开发者往往想要给自己的软件添加一个授权机制&#xff0c;只有当客户提供了授权码并且开发者将授权码放在授权管理系统的时候&#xff0c;客户端才能正常启动。这几天小陶就在捣鼓这个事&#xff0c;发现确实是可行的。 如果没有进行授权&a…

品牌传播策略中的智能内容推荐系统研究分析报告

品牌传播策略中的智能内容推荐系统研究分析报告 一、引言 随着信息技术的快速发展和互联网应用的普及,品牌传播策略正面临前所未有的变革。智能内容推荐系统作为这一变革的重要工具,正逐渐成为品牌传播的核心策略之一。本报告旨在深入研究智能内容推荐系统在品牌传播中的应…

【Linux 基础】df -h 的输出信息解读

df -h 的输出信息 xxx:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 16G 0 16G 0% /dev tmpfs 3.2G 792K 3.2G 1% /run /dev/sda1 32G 1.7G 30G 6% / tmpfs 16G 0 16G 0% /dev/shm tmp…

Ajax从零到实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

深入理解 Java 中的 `Socket` 类

在网络编程中&#xff0c;Socket 类是一个关键工具&#xff0c;用于实现客户端与服务器之间的通信。它为开发者提供了底层的网络通信能力&#xff0c;使得在不同机器之间传输数据变得简单而高效。本文将深入探讨 Java 中的 Socket 类&#xff0c;涵盖其基本概念、使用方法、应用…

VR头显如何低延迟播放8K的RTSP|RTMP流

技术背景 我们在做Unity平台RTSP、RTMP播放器的时候&#xff0c;有公司提出来这样的技术需求&#xff0c;希望在头显播放全景的8K RTSP|RTMP直播流&#xff0c;8K的数据&#xff0c;对头显和播放器&#xff0c;都提出了新的要求&#xff0c;我们从几个方面&#xff0c;探讨下V…

SpringAOP的坑

AOP中几种常见的通知类型及其基本作用&#xff1a; Before&#xff1a;前置通知&#xff0c;在目标方法执行之前执行。After&#xff1a;后置通知&#xff0c;无论方法执行结果如何&#xff08;包括异常&#xff09;&#xff0c;都会在目标方法执行之后执行。AfterReturning&a…

Elasticsearch 更新指定字段

Elasticsearch 更新指定字段 准备条件查询数据更新指定字段更新子级字段 准备条件 以下查询操作都基于索引crm_clue来操作&#xff0c;索引已经建过了&#xff0c;本文主要讲Elasticsearch更新指定字段语句&#xff0c;下面开始写更新语句执行更新啦&#xff01; 查询数据 查…

MacOS 通过Docker安装宝塔面板搭建PHP开发环境

1、docker拉取ubuntu系统 docker pull ubuntu2、运行容器 docker run -i -t -d --name bt -p 20:20 -p 21:21 -p 80:80 -p 443:443 -p 888:888 -p 8888:8888 -p 3306:3306 -p 6379:6379 --privilegedtrue -v /Users/oi/Sites:/www/wwwroot ubuntu-v 后的 /Users/oi/Sites 代表…

【电子通识】什么是无源元件的认证用可靠性试验标准AEC-Q200?

目前电动汽车已经是一个大趋势&#xff0c;汽车上安装有由多个电子零部件构成的ECU&#xff08;电子控制单元&#xff09;。即使汽车在恶劣的环境下行驶&#xff0c;电子零部件也必须不出故障地正常工作。因此&#xff0c;车载电子零部件与消费类电子相比&#xff0c;要求其达到…

力扣71.简化路径

力扣71.简化路径 根据双斜杠 求出每一组夹在里面的字符串 处理有意义的字符串 将所有路径存在字符串数组中最后用所有剩余的路径名称 变为答案 class Solution {public:string simplifyPath(string path) {vector<string> res;string ans;string cnt"";int …

Yarn标签调度--HDP测试

hadoop版本从2.7.2版本开始 新增标签调度功能。 标签调度功能&#xff1a;可以给节点设置标签 让作业任务调度到这个设置的标签节点。 列入&#xff1a; 某个任务需要用到gpu资源&#xff0c;而gpu并非在每个节点上都有&#xff0c;通过对节点设置标签&#xff0c;可以使作业…

光伏规约转换器,光伏并网,逆变器配套锦浪。

光伏规约转换器&#xff0c;光伏并网&#xff0c;逆变器配套锦浪&#xff0c;科士达&#xff08;4针航插&#xff09;&#xff0c;首航&#xff08;16针&#xff09;线束。 光伏规约转换器&#xff0c;光伏并网&#xff0c;逆变器配套锦浪。

网工内推 | 网络运维、云计算工程师,NP以上认证,平均薪资10K

01 网络运维 &#x1f537;岗位职责 1、至少3年以上的网络运维相关工作经验; 2、熟悉VLAN、STP、OSPF、RIP、BGP等网络技术; 3、熟悉IPsec、SSL等VPN技术; 4、熟悉主流网络安全厂商的各种产品; 5、精通TCP/IP协议&#xff0c;熟悉主流网络产品设备的调试、配置方法: 6、有…

某某会员小程序后端性能优化

背景 某某会员小程序后台提供开放平台能力&#xff0c;为三方油站提供会员积分、优惠劵等api。当用户在油站加油&#xff0c;油站收银会调用我们系统为用户发放积分、优惠劵等。用户反馈慢&#xff0c;三方调用发放积分接口性能极低&#xff0c;耗时30s&#xff1b; 接口情况…

ARM平台实现Docker容器技术

什么是Docker&#xff1f; &#xff08;1&#xff09;Docker的架构 Docker是一个开源的应用容器引擎&#xff0c;让开发者可打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的Linux或Windows机器上&#xff0c;亦可实现虚拟化。容器是完全使用沙…

GESP 2023年12月C++二级真题

参考程序1&#xff1a; #include<iostream> using namespace std;int first,second; int m,n; int sum 0;int fn(int n) {if(n1) {return first;} else if (n2) {return second;} else {return fn(n-1)fn(n-2);} } int main() {cin>>first>>second;cin>…

LeetCode 374, 128, 17

目录 374. 猜数字大小题目链接标签思路代码 128. 最长连续序列题目链接标签Set思路代码 Sort思路代码 17. 电话号码的字母组合题目链接标签思路代码 374. 猜数字大小 题目链接 374. 猜数字大小 标签 二分查找 交互 思路 看到本题的标签 交互 感觉有些奇怪&#xff0c;交互…

[Day 27] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的跨鏈技術 介紹 區塊鏈技術自誕生以來&#xff0c;已經在金融、供應鏈管理、醫療健康等多個領域取得了顯著的成就。然而&#xff0c;隨著不同區塊鏈平台的出現&#xff0c;如比特幣、以太坊、Hyperledger等&#xff0c;如何在不同區塊鏈之間進行數據和資產的互通成為了…

ubuntu22.04 编译freetype动态库

#-------------------------------------------------------------------- # ubuntu22.04 编译freetype动态库 #-------------------------------------------------------------------- 由于笔者在一项目中需要调用某几种特殊的字体&#xff0c;需要用到freetype&#xff0c;就…