首页 > 编程语言 >代码随想录算法训练营第十天|232. 用栈实现队列、225. 用队列实现栈

代码随想录算法训练营第十天|232. 用栈实现队列、225. 用队列实现栈

时间:2023-05-19 13:34:48浏览次数:54  
标签:return 第十天 队列 self 随想录 pop stack out

【参考链接】

1.栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。

2.栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。

3.栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。

4.队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器。

232. 用栈实现队列

【注意】

1.需要两个栈一个输入栈,一个输出栈。

2.在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。

3.如果进栈和出栈都为空的话,说明模拟的队列为空了。

【代码】

push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。 与pop()函数功能类似。

一定要懂得复用,功能相近的函数要抽象出来,不要大量的复制粘贴,很容易出问题!
empty() -- 返回队列是否为空。

 1 class MyQueue(object):
 2 
 3     def __init__(self):
 4         #in:push,out:pop
 5         self.stack_in = []
 6         self.stack_out = []
 7 
 8     def push(self, x):
 9         """
10         :type x: int
11         :rtype: None
12         """
13         self.stack_in.append(x) #直接往in里push,不需要判断
14 
15 
16     def pop(self):
17         """
18         :rtype: int
19         """
20         if self.empty(): #in,out为空则模拟的队列中没有元素
21             return None
22         
23         if self.stack_out: #out不为空时,先移除out中的元素
24             return self.stack_out.pop()
25         else:
26             #此时out为空,需要从in中加载数据到out中,再pop()
27             for i in range(len(self.stack_in)):
28                 self.stack_out.append(self.stack_in.pop())
29             #移除列表中的一个元素(默认最后一个元素)
30             return self.stack_out.pop()
31 
32 
33     def peek(self):
34         """
35         :rtype: int
36         """
37         ans = self.pop()
38         self.stack_out.append(ans)
39         return ans
40 
41 
42     def empty(self):
43         """
44         :rtype: bool
45         """
46         #只要in或者out有元素,说明队列不为空
47         return not(self.stack_in or self.stack_out)
48 
49 
50 
51 # Your MyQueue object will be instantiated and called as such:
52 # obj = MyQueue()
53 # obj.push(x)
54 # param_2 = obj.pop()
55 # param_3 = obj.peek()
56 # param_4 = obj.empty()

225. 用队列实现栈

【注意】

1.一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。

2.Python 中的 deque 是一个低级别的、高度优化的双端队列,对于实现优雅、高效的Pythonic 队列和堆栈很有用,它们是计算中最常见的列表式数据类型。

【代码】

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

  • push(x) -- 元素 x 入栈
  • pop() -- 移除栈顶元素
  • top() -- 获取栈顶元素
  • empty() -- 返回栈是否为空
 1 class MyStack(object):
 2 
 3     def __init__(self):
 4         self.que = deque()
 5 
 6     def push(self, x):
 7         """
 8         :type x: int
 9         :rtype: None
10         """
11         self.que.append(x)
12 
13     def pop(self):
14         """
15         :rtype: int
16         """
17         if self.empty():
18             return None
19         for i in range(len(self.que)-1):
20             self.que.append(self.que.popleft()) #出口
21         return self.que.popleft()
22 
23 
24     def top(self):
25         """
26         :rtype: int
27         """
28         if self.empty(): #为空
29             return None
30         return self.que[-1]
31 
32 
33     def empty(self):
34         """
35         :rtype: bool
36         """
37         return not self.que 
38 
39 
40 
41 # Your MyStack object will be instantiated and called as such:
42 # obj = MyStack()
43 # obj.push(x)
44 # param_2 = obj.pop()
45 # param_3 = obj.top()
46 # param_4 = obj.empty()

 

标签:return,第十天,队列,self,随想录,pop,stack,out
From: https://www.cnblogs.com/wuyijia/p/17414392.html

相关文章

  • 代码随想录算法训练营第九天|28. 找出字符串中第一个匹配项的下标、459. 重复的子字符
    【参考链接】28.找出字符串中第一个匹配项的下标【注意】1.kmp解决的就是字符串匹配的问题。2.kmp如何知道匹配过哪些字符串,并跳到匹配过的内容后面的字符。---前缀表3.找到一个子字符串里它的最长相等前后缀。4.前缀是包含首字母,不包含尾字母的所有子串;后缀只包含尾字母,不......
  • 八大常见的数据结构(一)数组、链表、栈、队列
    1、数组数组是用于储存有限个相同类型数据的集合。数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。可通过数组名和下标进行数据的访问和更新。下标从0开始。2、链表链表是一种物理存储单元上非连续、非顺序的存储结构。链表相较于数组,......
  • 单调队列优化dp
    单调队列优化dp对于一些比较简单的题目,我们可以直接凭借经验进行优化。但是对于类似\(max(f[j-kw]+kv)\)(多重背包)我们就很难凭借经验找到优化方式了这个时候,我们就可以尝试一下下面的方法:我们观察一些简单的,可以单调队列优化的方程,他们都有这样的形式:\(max/min(g[i-k])(L\l......
  • 消息队列篇
    本文章学习资源黑马程序员Kafka视频教程及资料,黑马程序员YYDS一、简介1.消息队列简介消息队列,英文名:MessageQueue,经常缩写为MQ。从字面上来理解,消息队列是一种用来存储消息的队列。我们可以简单理解消息队列就是将需要传输的数据存放在队列中。很多时候消息队列不是一个永久性......
  • STM32环形串口队列程序 大数据串口收发 实时不丢包 串口程序平常产品开发中编写或移
    STM32环形串口队列程序大数据串口收发实时不丢包串口程序平常产品开发中编写或移植的程序并亲自测试通过,均为工程文件格式,可直接编译使用。注:毫无基础的请勿拍,程序文件不接受退货。该程序为大数据量吞吐的串口收发例程,中断接收,边收边发,采用大数据环形队列,处理过程超快不丢包,接......
  • 7935: 最大值问题 单调队列
    描述 给定n个正整数,crq先选了第1~k个数,要求yuyu求出最大值,yuyu轻松完成,crq直接甩出一堆,要求第2~k+1个,3~k+2个,...,n-k+1~n个,全部都求出来,之后便轻松休息了。  输入 第一行两个整数 n和k(1≤k≤n≤106)。第二行 n个整数,表示编号1~n方格中的数字ai(1≤ai≤3×107)。......
  • 代码随想录算法训练营第8天 | ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer
     第四章 字符串part01  今日任务  ●  344.反转字符串●  541. 反转字符串II●  剑指Offer 05.替换空格●  151.翻转字符串里的单词●  剑指Offer58-II.左旋转字符串  详细布置   344.反转字符串  建议: 本题是字符串基础题目,就是考察......
  • 代码随想录算法训练营第七天|454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数
    【参考链接】454.四数相加II【注意】1.a+b作为key,出现次数作为value,0-(c+d)有没有在map集合里出现过,出现的次数做统计。遍历两个数组时间复杂度为O(n2)。【代码】1classSolution(object):2deffourSumCount(self,nums1,nums2,nums3,nums4):3"""......
  • 代码随想录算法训练营第7天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和
     第三章 哈希表part02  今日任务  ●  454.四数相加II ●  383. 赎金信 ●  15. 三数之和 ●  18. 四数之和 ●  总结    详细布置   454.四数相加II  建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序......
  • 使用优先队列寻找中位数
    Next,SupposewewouldliketoinventanewADTcalledMedianFinderwhichisacollectionofintegersandsupportsfindingthemedianofthecollection.MedianFinderadd(x);//addsxtothecollectionofnumbersmedian();//returnsthemedianfromacol......