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

[代码随想录Day10打卡] 理论基础 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

理论基础

队列先入先出。
栈先入后出。
具体的实现和用法根据语言的不同而不同。

参考的文章

  1. https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html

232.用栈实现队列

这个定义入栈和出栈,往队列中加入元素的时候就是栈中push操作一样,出栈的时候首先看出栈是否为空如果不为空那么出栈pop,如果出栈为空那么入栈中所有元素pop然后添加到出栈中。(双栈实现队列)
下面是C++,JAVA和Python的实现。

class MyQueue {
public:stack<int> stIn;stack<int> stOut;MyQueue() {}void push(int x) {stIn.push(x);//队列中加入元素就直接入栈就好    }int pop() {//当出栈为空的时候再将入栈中的元素加入到出栈,不会破坏他们的顺序if (stOut.empty()){//将stIn中的数据导入到stOutwhile(!stIn.empty()){stOut.push(stIn.top());stIn.pop();}}int result = stOut.top();//获得元素值,并且returnstOut.pop();return result;}int peek() {int res = this->pop();//直接使用现有的函数stOut.push(res);//因为pop弹出元素所有push回去return res;}bool empty() {return stIn.empty() && stOut.empty();}
};/*** Your MyQueue object will be instantiated and called as such:* MyQueue* obj = new MyQueue();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->peek();* bool param_4 = obj->empty();*/
class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;public MyQueue() {stackIn = new Stack<>();//负责进栈,JAVA必须new一个空间stackOut = new Stack<>();//负责出栈}//入栈public void push(int x) {stackIn.push(x);//这个就是JAVA的栈}public int pop() {dumpstackIn();//后面自定义的一个函数,这个就是判断出栈是否为空,如果为空就将入栈中的所有元素导入到出栈return stackOut.pop();}public int peek() {dumpstackIn();return stackOut.peek();}public boolean empty() {return stackIn.isEmpty() && stackOut.isEmpty();}public void dumpstackIn(){if (!stackOut.isEmpty()) return;//如果出栈不为空就返回。之后正常pop和peek就可以while(!stackIn.isEmpty()){stackOut.push(stackIn.pop());}}
}/*** Your MyQueue object will be instantiated and called as such:* MyQueue obj = new MyQueue();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.peek();* boolean param_4 = obj.empty();*/
class MyQueue(object):def __init__(self):self.stack_in = []self.stack_out = []def push(self, x):""":type x: int:rtype: None""""""有新元素进来,就往stack_in里面push"""self.stack_in.append(x)def pop(self):""":rtype: int"""if self.empty():return Noneif self.stack_out:return self.stack_out.pop()else:for i in range(len(self.stack_in)):self.stack_out.append(self.stack_in.pop())return self.stack_out.pop()def peek(self):""":rtype: int"""ans = self.pop()self.stack_out.append(ans)return ansdef empty(self):""":rtype: bool"""return not (self.stack_in or self.stack_out)# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()

参考的文章

  1. https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html

225. 用队列实现栈

可以和上面方法相同使用两个队列表示栈,也可以使用一个队列表示栈。一个队列就是往栈中加入元素就是队列的push,弹出元素就是找到栈应该弹出的元素移动到队列的最开始然后pop。JAVA中有个实现是在加入元素的时候进行操作,将队列的顺序变成栈的顺序,弹出元素就是pop。
其中JAVA注释掉的没有按照queue来操作而是使用dequeue
下面是C++,JAVA和Python的实现。

class MyStack {
public:queue<int> que;//MyStack() {}void push(int x) {que.push(x);}int pop() {int size = que.size();size--;//弹出其中size-1个元素while(size--){//将队列头部元素(除了最后一个元素外)重新加到队列尾部que.push(que.front());//获得队列中的最前面的元素加入到队列que.pop();//然后弹出}int result = que.front();//弹出的元素正好在队列最前面que.pop();return result;}int top() {return que.back();        }bool empty() {return que.empty();}
};/*** Your MyStack object will be instantiated and called as such:* MyStack* obj = new MyStack();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->top();* bool param_4 = obj->empty();*/
class MyStack {Queue<Integer> queue;public MyStack(){queue = new LinkedList<>();}public void push(int x){//这个思路是在入栈的时候进行操作,每次入栈新元素都调整现有的队列顺序与栈的出栈顺序相同queue.offer(x);//安全与add相比,队列满的话会返回false,不会阻塞等待队列有空间int size = queue.size();//移动除了新加入的元素的其他元素while (size-- > 1)queue.offer(queue.poll());}public int pop(){return queue.poll();}public int top() {return queue.peek();}public boolean empty(){return queue.isEmpty();}// Deque<Integer> deque;//deque是不是双向队列// public MyStack() {//     deque = new ArrayDeque<>();// }// public void push(int x) {//     deque.addLast(x);//在最后加入// }// public int pop() {//     //我感觉这个双向列表完成pop操作可以简化,但是为了练习就是好像当作单向队列,我这里还是当作双向队列//     return deque.removeLast();// }// public int top() {//     return deque.peekLast();// }// public boolean empty() {//     return deque.isEmpty();// }}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/
from collections import deque
class MyStack(object):def __init__(self):self.que = deque()def push(self, x):""":type x: int:rtype: None"""self.que.append(x)def pop(self):""":rtype: int"""if self.empty():return Nonefor i in range(len(self.que)-1):self.que.append(self.que.popleft())return self.que.popleft()def top(self):""":rtype: int"""if self.empty():return Noneans = self.pop()self.que.append(ans)return ansdef empty(self):""":rtype: bool"""return not self.que# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

参考的文章

  1. https://programmercarl.com/0225.%E7%94%A8%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E6%A0%88.html

20. 有效的括号

栈的应用。
不匹配的情况三种:1. 左括号多了 2. 右括号多了 3. 左右括号不匹配
Tips:就是如果遍历中遇到左括号就往栈中存储相对应的右括号。遇到右括号就进行判断,如果栈为空就说明右括号多了输出false,如果栈的top元素不等于当前的右括号就说明不匹配输出false,其他情况就是说明匹配弹出相应的元素。如果遍历完字符串栈不为空就说明左括号多了输出fa;se,否则就是左右括号匹配输出true。
下面是C++,JAVA和Python的实现。

class Solution {
public:bool isValid(string s) {stack<char> st;if(st.size()%2!=0) return false;for(int i = 0; i < s.size(); i++){//遍历字符串if(s[i]=='(') st.push(')');else if(s[i]=='{') st.push('}');else if(s[i]=='[') st.push(']');else if (st.empty() || st.top()!=s[i]) return false;else st.pop();}return st.empty();}
};
class Solution {public boolean isValid(String s) {Deque<Character> deque = new LinkedList<>();char ch;for(int i = 0; i < s.length(); i++){ch = s.charAt(i);//存储字符进行比较if(ch == '(') deque.push(')');else if(ch == '(') deque.push(')');else if(ch == '{') deque.push('}');else if(ch == '[') deque.push(']');else if(deque.isEmpty() || deque.peek()!=ch){return false;}else deque.pop();}return deque.isEmpty();}
}
class Solution(object):def isValid(self, s):""":type s: str:rtype: bool"""stack = []for item in s:if item == '(':stack.append(')')elif item == '[':stack.append(']')elif item == '{':stack.append('}')elif not stack or stack[-1]!=item:return Falseelse:stack.pop()return True if not stack else False 

参考的文章

  1. https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html

1047. 删除字符串中的所有相邻重复项

栈的应用。与有效括号类似。
就是使用string类型变量实现栈的操作。定义string类型变量result。
如果result为空或者result的栈顶的元素与当前元素不匹配就将当前元素push到栈中。如果匹配就pop。遍历结束后输出result。
下面是C++,JAVA和Python的实现。

class Solution {
public:string removeDuplicates(string S) {string result;for (char s: S){if(result.empty() || s!=result.back()) result.push_back(s);else result.pop_back();}return result;}
};
class Solution {public String removeDuplicates(String S) {ArrayDeque<Character> deque = new ArrayDeque<>();char ch;for (int i = 0; i < S.length(); i++){ch = S.charAt(i);if(deque.isEmpty() || deque.peek() != ch) deque.push(ch);else deque.pop();}String str = "";while(!deque.isEmpty()){str = deque.pop()+ str;}return str;}}
class Solution(object):def removeDuplicates(self, s):""":type s: str:rtype: str"""res = list()for item in s:if res and res[-1] == item:res.pop()else:res.append(item)return "".join(res)

参考的文章

  1. https://programmercarl.com/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.html

相关文章:

[代码随想录Day10打卡] 理论基础 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

理论基础 队列先入先出。 栈先入后出。 具体的实现和用法根据语言的不同而不同。 参考的文章 https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 232.用栈实现队列 这个定义入栈和出栈&#xff0c;往队列中加入…...

redis:RDB和AOF机制

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言RDBAOF总结 前言 redis是一个内存数据库&#xff0c;把数据存储在内存中的&#xff0c;而内存中的数据是不持久的&#xff0c;要想能够做…...

券商隔夜单自动下单交易接口

之前研究打板排板&#xff0c;研究怎么才能买得进去。 最近遇到几只利空跌停板&#xff0c;缩量跌停&#xff0c;明天大概率继续一字封板跌停。 如果卖不掉&#xff0c;意味着还要继续吃几个跌停&#xff0c;甚至ST票十几个跌停都有可能。 一次跌停亏几万&#xff0c;还是挺…...

生成任意3D和4D场景!GenXD:通用3D-4D联合生成框架 | 新加坡国立微软

文章链接: https://arxiv.org/pdf/2411.02319 项目链接&#xff1a;https://gen-x-d.github.io/ 有视频 亮点直击 设计了一个数据整理流程&#xff0c;从视频中获取包含可移动物体的高质量4D数据&#xff0c;并为30,000个视频标注了相机姿态。这个大规模数据集称为CamVid-30K&…...

通过命令学习k8s

1、kubectl 命令可以列出所有命令 2、kubectl version 命令可以查看版本号 3、kubectl cluster-info命令可以查看集群信息&#xff08;192.168.218.136:6443 即为kube-apiserver的IP和端口。&#xff09; [rootk8s-master ~]# kubectl cluster-info Kubernetes master is run…...

【redis】—— 初识redis(redis基本特征、应用场景、以及重大版本说明)

序言 本文将引导读者探索Redis的世界&#xff0c;深入了解其发展历程、丰富特性、常见应用场景、使用技巧等&#xff0c;最后会对Redis演进过程中具有里程碑意义的版本进行详细解读。 &#xff08;一&#xff09;初始redis Redis是一种基于键值对&#xff08;key-value&#x…...

服务器显卡和桌面pc显卡有什么不同

服务器显卡和桌面 PC 显卡在设计目标、性能优化、功能支持和硬件规格上都有显著不同。以下是主要区别&#xff1a; 1. 设计用途 服务器显卡&#xff1a;主要用于计算、深度学习、数据分析、科学计算、虚拟化和图形渲染等任务。其设计目标是持续高负载计算&#xff0c;保证高稳…...

Chrome使用IE内核

Chrome使用IE内核 1.下载扩展程序IE Tab 2.将下载好的IE Tab扩展程序拖拽到扩展程序界面&#xff0c;之后重启chrome浏览器即可...

类和对象(C++)——默认成员函数,构造函数,析构函数

1. 类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;不写的情况下编译器会默认生成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前4个&#xff0c;最后两个取地址重载&#…...

深入理解 Vue v-model 原理与应用

一、引言 在 Vue.js 开发中,v-model是一个非常重要且强大的指令。它为开发者在处理表单输入和数据双向绑定等场景中提供了极大的便利。无论是新手还是有经验的开发者,深入理解v-model对于高效地构建 Vue 应用至关重要。本文将对v-model进行深入剖析,从其基本原理、使用方式…...

内网域环境、工作组、局域网等探针方案

1. 信息收集 1.1 网络收集 了解当前服务器的计算机基本信息&#xff0c;为后续判断服务器角色&#xff0c;网络环境做准备 systeminfo 详细信息 net start 启动服务 tasklist 进程列表 schtasks 计划任务&#xff08;受权限影响&#xff09; 了解当前服务器的网络接口信息…...

uniapp—android原生插件开发(3Android真机调试)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 一、打包uniapp资源包&#xff1a; 打包…...

goframe开发一个企业网站 统一返回响应码 18

响应码的logic package returncodeimport ("context""gf_new_web/internal/service""github.com/gogf/gf/v2/errors/gcode""github.com/gogf/gf/v2/frame/g" )type sReturncode struct { }var (insReturncode sReturncode{}…...

基于STM32的智能门禁系统设计

引言 本项目基于STM32微控制器设计了一个智能门禁系统&#xff0c;通过集成多个传感器模块和控制设备&#xff0c;实现对门禁系统的自动化管理与控制。该系统能够通过RFID卡、密码输入、以及指纹传感器等多种方式对进出人员进行验证&#xff0c;并结合LCD显示屏提供实时信息反…...

Python学习从0到1 day28 Python 高阶技巧 ⑧ 递归

那就祝我们爬不同的山&#xff0c;还能回到同一条路上&#xff0c;不是时时见面&#xff0c;但是时时惦记之人 —— 24.11.13 递归 1.什么是递归 递归在编程中是一种非常重要的算法 递归&#xff1a;即方法(函数)自己调用自己的一种特殊编程写法 函数调用自己&#xff0c;即…...

知识见闻 - 苹果手机拨号键长按

苹果手机&#xff08;iPhone&#xff09;在拨号界面长按按键时有一些特定的功能。以下是iPhone拨号键盘上长按按键的主要功能&#xff1a; 数字键 0 - 长按可输入""号&#xff0c;用于国际电话拨号 - 这是最常用的长按功能之一&#xff0c;方便用户拨打国际电话 星号…...

在 KubeVirt 中使用 GPU Operator

在 KubeVirt 中使用 GPU Operator 基于最新的GPU Operator版本24.9.0。 原文链接&#xff1a;GPU Operator with KubeVirt — NVIDIA GPU Operator 24.9.0 documentation 1. 简介 KubeVirt 是 Kubernetes 的一个虚拟机管理插件&#xff0c;允许您在 Kubernetes 集群中运行和…...

安慰剂检验Stata代码(全套代码、示例数据及参考文献)

数据简介&#xff1a;随着因果推断方法在实证研究中的使用比例不断提升&#xff0c;越来越多的文章进行安慰剂检验。其检验基本原理与医学中的安慰剂类似&#xff0c;即使用假的政策发生时间或实验组进行分析&#xff0c;以检验能否得到政策效应。如果依然得到了政策效应&#…...

DAY6 线程

作业1&#xff1a; 多线程实现文件拷贝&#xff0c;线程1拷贝一半&#xff0c;线程2拷贝另一半&#xff0c;主线程回收子线程资源。 代码&#xff1a; #include <myhead.h> sem_t sem1; void *copy1()//子线程1函数 拷贝前一半内容 {int fd1open("./1.txt",O…...

基于STM32的智能门锁系统设计思路:蓝牙、RFID等技术

一、项目概述 在现代家居安全领域&#xff0c;传统门锁因其安全性不足、开锁方式单一等问题&#xff0c;已逐渐无法满足用户的需求。传统机械锁容易被撬开、复制钥匙&#xff0c;同时开锁方式仅限于物理钥匙&#xff0c;给用户带来不便。因此&#xff0c;本文旨在设计并开发一…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...