ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Leetcode 算法面试冲刺 栈与队列 理论 上(十八)

2022-01-31 20:02:32  阅读:153  来源: 互联网

标签:return 函数 队列 self 冲刺 item last Leetcode first


文章目录

python没有栈,需要用list去实现。list也有pop操作。list可以说比stack更厉害一些,因为list可以按索引访问。
在这里插入图片描述
在这里插入图片描述
peek是查看栈顶元素,但是不弹出。
在这里插入图片描述

栈的实现

在这里插入图片描述

练习题 423 · 有效的括号序列

给定一个字符串所表示的括号序列,包含以下字符: ‘(’, ‘)’, ‘{’, ‘}’, ‘[’ and ‘]’, 判定是否是有效的括号序列。

括号必须依照 “()” 顺序表示, “()[]{}” 是有效的括号,但 “([)]” 则是无效的括号。
在这里插入图片描述

def isValidParentheses(self, s):
    # write your code here
        if not s: return True

        stack = []

        for i, ch in enumerate(s):
            if ch == '(' or ch == "[" or ch == '{':
                stack.append(ch)
            else:
                if not stack:
                    return False
                elif (ch == ')' and stack[-1] == '(') or \
                    (ch == ']' and stack[-1] == '[') or \
                    (ch == '}' and stack[-1] == '{'):
                    stack.pop()
                else:
                    return False

        return not stack

这道题因为上课的时候老师讲了,所以我没有自己想,之前也做过类似的题,大体知道用什么方法做。
在这里插入图片描述
if not 的用法更新:注意’’’’ 和“ ”是不一样的。另外[]可以用

if not "":
    print(1)
    
if not " ":
    print(11)
    
if not []:
    print(2)

栈的调用

在这里插入图片描述
一个主调函数去调用被调函数,被调函数就会执行,当被调函数执行完毕,就返回到主调函数中调用它的位置。那么在操作系统底层,是怎么维护主调和被调的函数关系的?
在这里插入图片描述
main pc就是记录main函数的program count。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
每次调用一个被调函数,都会在栈中记录原主函数的pc。
在这里插入图片描述
baz结束后,baz函数的变量全部被清除。找到离栈顶最近的pc。pc可以回到上一个主函数调用的被调函数的位置。
在这里插入图片描述
bar函数执行完,释放arr,去找foo pc。回到foo函数
在这里插入图片描述
foo函数释放name变量,回到main函数
在这里插入图片描述
main函数执行完毕,释放num。栈为空。
在这里插入图片描述
Question:为什么这需要一个栈的数据结构呢?
栈是一个线性的数据结构。
当有很多很多的函数不断的往栈里压入的时候,就会报错:栈溢出。index
out of range. stack overflow. 可能是写成死循环了。

def stackoverflow(count = 1):
    count += 1
    print(count)
    stackoverflow(count)
    
stackoverflow(count = 1)

刚刚我自己跑了下,调用100次,就溢出了。
栈的存在,让函数之间的调用变得优雅,简单。

队列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
head和tail两个指针,分别指向链表的首尾。方便进队列和出队列。

练习题 492 · 队列维护

按链表实现队列。支持以下基本方法:

  • enqueue(item).将新元素放入队列中。
  • dequeue(). 将第一个元素移出队列,返回它。

class MyQueue:
    """
    @param: item: An integer
    @return: nothing
    """
    def __init__(self):
        self.first = None
        self.last = None

    def enqueue(self, item):
        # write your code here
        if not self.first:
            self.first = ListNode(item)
            self.last = self.first
        else:
            self.last.next = ListNode(item)
            self.last = self.last.next

    """
    @return: An integer
    """
    def dequeue(self):
        # write your code here
        if self.first:
            cur = self.first
            self.first = cur.next
            return cur.val

在这里插入图片描述

在这里插入图片描述
官方答案:

class MyQueue(object):

    def __init__(self):
        # do some intialize if necessary
        self.first, self.last = None, None

    # @param {int} item an integer
    # @return nothing
    def enqueue(self, item):
        # Write yout code here
        if self.first is None:
            self.first = Node(item)
            self.last = self.first
        else:
            self.last.next = Node(item)
            self.last = self.last.next

    # @return an integer
    def dequeue(self):
        # Write your code here
        if self.first is not None:
            item = self.first.val
            self.first = self.first.next
            return item

        return -1000

class Node():

    def __init__(self, _val):
        self.next = None
        self.val = _val

Queue有一个maxsize,如果不写,默认是0. maxsize<1表示无限的大小。如果是100,就是100的长度。

操作系统的内容有一个消息队列,我们动鼠标或者键盘都会放到这个消息队列里面,操作系统的kernel就会按照这个消息的先进先出,依次完成任务。

from queue import Queue
q = Queue()
for i in range(10):
    q.put(i)

while not q.empty():
    print(q.get(), end=" ")
print()
print(q.qsize())

注意while的条件,我写

while q:

就会进入死循环,说明q虽然为空了,但是还是有值。所以要用empty()。

标签:return,函数,队列,self,冲刺,item,last,Leetcode,first
来源: https://blog.csdn.net/weixin_43716712/article/details/122760535

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有