首页 > 其他分享 >Day10 栈和队列Part1

Day10 栈和队列Part1

时间:2024-07-26 12:41:24浏览次数:6  
标签:return 队列 self pop Part1 Day10 stack append

任务

232. 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)

思路

算是一个模拟类的题目,用py中,用列表加上限制条件表示栈(只能用pop表示对栈顶元素出栈处理)

  • push:用stackIn保存入队元素
  • pop: 出队时,分三种情况,
    • 如果队列为空,则返回None
    • 如果stackOut中还有元素,则弹出栈顶元素
    • 如果stackOut中没有元素,则将stackIn中的元素依次弹出并加入到stackOut栈中,全部完成后,弹出stackOut栈顶元素
  • peek: 弹出stackOut栈顶元素并保存其值,然后重新加入栈顶,返回之前保存的值
  • empty: 只有stackOut和stackIn全为空,才为空
class MyQueue:
    def __init__(self):
        self.stackIn = []
        self.stackOut = []

    def push(self, x: int) -> None:
        self.stackIn.append(x)

    def pop(self) -> int:
        if self.empty(): return None
        if self.stackOut: return self.stackOut.pop()
        else: 
            while self.stackIn:
                self.stackOut.append(self.stackIn.pop())
            return self.stackOut.pop()

    def peek(self) -> int:
        res = self.pop()
        self.stackOut.append(res)
        return res

    def empty(self) -> bool:
        return (not self.stackIn and not self.stackOut) 


# 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()

225. 用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)

思路

两个队列的思路类似上一题,实际只需要一个队列即可。此外,由于用py实现,如果用List模拟队列,移除时需要pop(1),时间复杂度为O(n),因此用deque和popleft代替来模拟队列。
思路时出栈时,实际就是将队列的前n-1个元素放到队尾,再弹出队列首元素即可。而top更简单栈顶元素即为队尾元素。

class MyStack:

    def __init__(self):
        self.queue = deque()

    def push(self, x: int) -> None:
        self.queue.append(x)

    def pop(self) -> int:
        if self.empty():return None
        for i in range(len(self.queue)-1):
            self.queue.append(self.queue.popleft())
        return self.queue.popleft()
        
    #这种方法虽然能实现,由于是双端队列,访问末尾时间复杂度上也不会有问题,但是若当作普通队列模拟,则可采用top2的方法
    #实际py中没必要,实现是为了其他语言且题意要求用普通队列的情况下
    def top(self) -> int:
        if self.empty():return None
        return self.queue[-1] 
    
    def top2(self)->int:
        res = self.pop()
        self.queue.append(res)
        return res

    def empty(self) -> bool:
        return not self.queue


# 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()

20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
遍历过程中,用栈存储左括号,右括号依次匹配最近的左括号
遍历过程中无效分三种情况

  • 左边有多余符号 如 '({}' 最终栈不为空
  • 右边有多余符号 如 '{})' 中间想匹配发现栈已经为空了
  • 中间不匹配,如 '[{(})' 中间发现不匹配直接return False
class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        for c in s:
            if c == '(':
                stack.append(')')
            elif c == '{':
                stack.append('}')
            elif c == '[':
                stack.append(']')
            elif(not stack or stack[-1] != c): #第2,3种情况
                return False
            else: stack.pop()
            # elif c == ')': #冗余的写法
            #     if stack and stack[-1] == ')': 
            #         stack.pop()
            #     else: 
            #         return False
            # elif c == ']':
            #     if stack and stack[-1] == ']': 
            #         stack.pop()
            #     else: 
            #         return False
            # elif c == '}':
            #     if stack and stack[-1] = '}': 
            #         stack.pop()
            #     else: 
            #         return False 
        return not stack

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

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

思路

按照上述逻辑用栈模拟即可,符合条件的就加入栈中,否则就移除。最终得到一个字符栈,由栈底到栈顶的顺序的字符组成即为所求字符串,又因为py是中用List模拟的栈,因此很方便地直接将List转为str即可(对于栈已经是逆序的)
如果是其他语言如CPP,需要将栈元素弹出并且拼接到字符串上,还需要反转。

class Solution:
    def removeDuplicates(self, s: str) -> str:
        stack = []
        for c in s:
            # if not stack: #栈为空时
            #     stack.append(c)
            # elif stack and stack[-1] != c:#栈不为空且当前元素不等于栈顶元素
            #     stack.append(c)
            # else:
            #     stack.pop()
            if stack and stack[-1] == c: 
                stack.pop()
            else: 
                stack.append(c)
        return ''.join(stack)

心得体会

栈和队列的题目中,主要是想到用栈或队列解决问题后,动手模拟一下遍历过程中,栈或者队列的变化情况。在py中,用列表提供有限的操作模拟栈,比如只能访问栈顶,只能添加移除栈顶元素,均是在列表末尾进行操作([-1],append,pop),由于列表删除最前面的值时间复杂度为O(N),所以使用deque双端队列,如果模拟的是普通队列,只能从尾进头出(append,popleft),访问首元素等([0])。
此外,栈常常用于匹配最近元素或者刚刚访问过的元素等,如括号匹配和删除字符串中的重复元素。

标签:return,队列,self,pop,Part1,Day10,stack,append
From: https://www.cnblogs.com/haohaoscnblogs/p/18325057

相关文章

  • 算法入门篇(四)之栈和队列
    目录一、顺序栈、链栈1、顺序栈1.定义与存储结构2.特点3.适用场景2、链栈1.定义与存储结构2.特点3.适用场景3、总结二、顺序队列、链式队列1、顺序队列1.定义与存储结构2.特点3.循环队列4.适用场景2、链式队列1.定义与存储结构2.特点3.适用......
  • 数据结构之队列详解
    1.队列的概念以及结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFo(FristinFristout)的特性入队列:进行插入才操作的一端称为队尾出队列:进行删除操作的一端称为队头2.队列的实现队列也可以使用数组和链表的结构实现,使用......
  • Java笔记day10
    一,不同方式创建多个线程并打印(1)定义了一个RunA实现Runnable接口,定义list存储数据,并重写了run方法 ,在run方法里定义循环向list中添加数据a;在main方法中创建a,b两个线程并引用该run方法,输出run对象的list和长度publicstaticvoidmainB(String[]args){RunAru......
  • Day10--mybatis多表连接查询学习(一对一、一对多、多对多)
    MyBatis是一个优秀的持久层框架,支持将SQL语句、存储过程以及高级映射转换成Java对象。下面是MyBatis处理一对一、一对多、多对多关系的方式及相应的代码示例。数据库表假设有四个表:user、orders、role、user_role---->创建代码(占位较长)放在文章末尾···首先先了解对应......
  • 栈,队列,链表
     栈堆栈又名栈(stack),它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈......
  • 嵌入式学习--DAY10:函数的调用
    一、函数参数和函数的值1.在定义函数中指定的形参,在未出现函数调用时,它们并不占用内存中的存储单元,只有在发生函数调用时,函数中的形参才会被分配内存单元。在调用结束后,形参所占的内存单元也会被释放。2.实参可以是常量、变量或表达式。在被定义的函数中,必须指定形参的类型,实......
  • 通过“ 栈 ”实现“ 队列 ”
                  ......
  • SpringBoot 结合官网对MQTT消息队列整合记录
    SpringBoot结合官网对MQTT消息队列整合首先是mavenPom的引入MqttClient<dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.2.......
  • C#连接使用ActiveMQ消息队列
      安装部署好集群环境:192.168.209.133:61616,192.168.209.134:61616,192.168.209.135:61616因为ActiveMQ的集群模式是一种master-slave模式,master节点对外提供服务,slave节点只做数据同步备份,当master节点挂了,slave就会成为master从而继续对外提供服务,以此实现高可用。......
  • 队列及其C语言实现
    2.3队列2.3.1什么是队列队尾入队,队头出队,一个受限制性的线性表。队列(Queue):具有一定操作约束的线性表•插入和删除操作:只能在一端插入,而在另一端删除。•数据插入:入队列(AddQ)•数据删除:出队列(DeleteQ)•先来先服务•先进先出:FIFO 2.3.2队列的抽象数据类型描述 ......