unity消息队列判断字符串相等有错误_leetcode刷题(七):栈和队列

6d81405a5362f516e6760dc0d0089cfa.png

今天讲的是栈和队列的问题。

这个问题不难,大家就当是复习下吧!~!

首先我们来复习下栈的基本概念。

栈是限定仅在表尾进行插入和删除操作的线性表。

我们把允许插入和删除的一端称之为栈顶,另一端称之为栈底,不含任何元素的称之为空栈。栈又称之为后进先出的线性表,简称为LIFO结构。

栈的插入操作,叫做进栈,也称之为压栈,入栈。栈的删除操作,叫做出栈,也称之为弹栈。

栈的顺序储存结构类似于出栈进栈操作,这个我也就不多废话了,今天我们来讲讲两栈的共享空间

如果我们有两个栈,一个已经满了,再加入就要溢出了,而另一个栈还是空空如也,这是一种可耻的浪费啊!~!我们完全可以用一个数组来存储两个栈,只不过需要一点小技巧。

我们的做法很简单,数组有两个端点,两个栈有两个栈底。我们让一个栈的栈底为数组的始端,即下标为0处,一个栈的栈底为数组的末端,即下标为n-1处。

其实关键思路是:他们是在数组的两端,向中间靠拢。

其他思路也就很清楚了,当栈1为空的时候,就是top==-1,当top==n时,栈2为空。当然了,我们还需要一个stackNumber参数来判断时栈1还是栈2。

实际上,在外面实际运用当中,这种数据结构往往都是用在两个栈有相反关系的情况下,就是一个栈增长一个栈缩短的情况下。

讲完了这些基本操作,我们来聊一些有趣的东西:栈的运用--四则运算表达式求值

这里的四则运算就是我们小学时候学过的四则混合运算,先算括号里面的,再算乘除,最后算加减。

这很容易理解,但是对电脑来说并不是这样的,特别是在引入了括号以后。但是我们在进一步引入栈这个概念以后,事情就变得简单多了。

我们观察后发现,括号都是成对出现的,也就是说有左括号就一定有右括号,对于多重括号,最后也是完全嵌套匹配的。这与栈的结构完全合适,只要是左括号就进栈,不管表达式有多重括号,反正遇到左括号就进栈,后面遇到右括号的时候就让栈顶的左括号出栈,期间让数字运算,这样,最终由括号的表达式从左到右巡查一遍,栈应该是由空到有元素,最终再因全部匹配成功后成为空栈。

后来,波兰有位大佬,想出了一种不需要括号的后缀表达法,我们也称之为逆波兰表达式。

老规矩,举个栗子:9 +( 3 - 1 )* 3 + 10 / 2,如果用后缀表达式应该怎么写呢?

9 3 1 - 3 * + 10 2 / +

因为所有符号都在运算数字后面出现,所以称之为后缀表达式。

具体的运算方式也很简单:从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号就将位于栈顶的两个数字出栈,进行运算,运算结果再进栈,一直到最终获得结果。

既然后缀表达式这么流批,那么我们怎么将它从中缀表达式转换成后缀表达式呢?

还是举老栗子,把中缀表达式9 +( 3 - 1 )* 3 + 10 / 2转换成后缀表达式9 3 1 - 3 * + 10 2 / +。

规则如下:从左到右遍历中缀表达式的各个数字和符号。若是数字就输出,成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或者优先级不高于栈顶符号(乘除高于加减)则栈顶元素依次出栈并输出,并将当前元素入栈,直到最终输出后缀表达式为止。

队列

队列就是只允许在一段进行插入操作,在另一端进行删除操作的线性表。

队列是一种先进先出的线性表,简称FIFO,允许插入的一端称之为队尾,允许删除的一端称之为队头。

所谓的入队操作呢,就是在队尾增加一个元素,所谓的出队操作呢,就是在队头删去一个元素。为了进一步方便起见,我们引入两个指针,front指针指向队头元素,rear元素指向队尾元素。这样当front==rear时,为空队列。

那么问题来了,假设这个队列总数不超过5个,但是不停地有元素入队,那么就会产生数组越界的错误。可实际上,队头的部分(比如说下标为0和1的部分)还是空闲的。我们把这种情况称之为“假溢出”。

解决“假溢出”的办法就是后面满了,我们再从头开始,也就是头尾相接的循环。我们把队伍的这种头尾相接的顺序存储结构称之为循环队列。

当然,下一个问题就出来了,当空队列时,front==rear,当满队列时,也是front==rear。

所以要设置一个标志位flag,当front==rear,且flag=0时,队列为空;当front==rear,且flag=1时,队列为满。

所以总结一下:队满的条件:(rear+1)%QueueSize() == front

计算队列的长度:(rear-front+QueueSize)%QueueSize

接下来是真题时间!~!

232. 用栈实现队列

使用栈实现队列的下列操作:

push(x) -- 将一个元素放入队列的尾部。

pop() -- 从队列首部移除元素。

peek() -- 返回队列首部的元素。

empty() -- 返回队列是否为空。

示例:

MyQueue queue = new MyQueue();

queue.push(1);

queue.push(2);

queue.peek(); // 返回 1

queue.pop(); // 返回 1

queue.empty(); // 返回 false

class MyQueue(object):

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.input = []
        self.output = []
 

    def push(self, x):
        """
        Push element x to the back of queue.
        :type x: int
        :rtype: None
        """
        self.input.append(x)
 

    def pop(self):
        """
        Removes the element from in front of queue and returns that element.
        :rtype: int
        """
        self.peek()
        return self.output.pop()
 

    def peek(self):
        """
        Get the front element.
        :rtype: int
        """
        while not self.output:
            while self.input:
                self.output.append(self.input.pop())
        return self.output[-1]
 

    def empty(self):
        """
        Returns whether the queue is empty.
        :rtype: bool
        """
        return not self.input and not self.output    

20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"

输出: true

示例 2:

输入: "()[]{}"

输出: true

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        mapping = {')':'(',']':'[','}':'{'}
        left = mapping.keys()
        right = mapping.values()
        stack = []
        for str in s:
            if str in left:
                if stack and stack[-1] == mapping[str]:
                    stack.pop()
                else:
                    return False
            elif str in right:
                stack.append(str)
        return not stack

739. 每日温度

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的都是 [30, 100] 范围内的整数。

class Solution(object):
    def dailyTemperatures(self, T):
        """
        :type T: List[int]
        :rtype: List[int]
        """
        t_length = len(T)
        stack = list()
        res_list = [0 for _ in range(t_length)]
 
        for key,value in enumerate(T):
            if stack:
                while stack and T[stack[-1]] < value:
                    res_list[stack[-1]] = key - stack[-1]
                    stack.pop()
            stack.append(key)
        return res_list    

差不多就是这样了,希望本文能帮到你!~!

最后打个小广告,我的公众号,喜欢写点学习中的小心得,不介意可以关注下!~!

f0fba390afddedaa1900e8cfddc26903.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值