[剑指offer] 5. 用两个栈实现队列+[剑指offer]30. 包含min函数的栈(等同于leetcode155) +[剑指offer]31.栈的压入、弹出序列 (队列 栈)
c++里面stack,queue的pop都是没有返回值的,
vector的pop_back()也没有返回值。
思路:
队列是先进先出 , 在stack2里逆序放置stack1的元素,然后stack2.pop()
但是当s1,s2都有元素时,应该优先s2.pop(),否则会报错,最好是各种模拟s1,s2的数据情况
不过说是用两个栈实现,但这里其实也是两个List
# -*- coding:utf-8 -*- class Solution: def __init__(self): self.stack1=[] self.stack2=[] def push(self, node): # write code here self.stack1.append(node) def pop(self): # return xx # 思路就是在stack2里逆序放置stack1的元素,然后stack2.pop() # 但是当s1,s2都有元素时,应该优先s2.pop() if self.stack2==[]: while self.stack1: self.stack2.append(self.stack1.pop()) return self.stack2.pop() return self.stack2.pop()
- 两个栈在函数里,注意自己要事先定义,初始化
- 一定是 self.stack,直接用stack会报错,未定义
思路:
借助一个辅助栈,始终存放数据栈中的最小值(辅助栈元素个数与数据栈相同,如数据栈为3,2,4,1,则辅助栈为3,2,2,1),这样只要输出当前辅助栈顶的元素就能保证时间复杂度为O(1)。
那么同时,push的时候也要考虑辅助站的输入;
每当数据站pop一下,无论该数据是否为最小值,辅助栈也要pop一个数据。
当第一次push时,辅助栈为None,直接push当前node,如果进行大小比较的话,辅助栈会输入none而报错。
同时,注意self,与stack,assist两个栈的初始化。
# -*- coding:utf-8 -*- class Solution: def __init__(self): self.stack=[] self.assist=[] def push(self, node): # write code here minimum=self.min() if(node<minimum or minimum==None): self.assist.append(node) #python的list只有append操作,c++的vector是push_back else: self.assist.append(minimum) self.stack.append(node) def pop(self): # write code here if self.stack: #鲁棒性考虑 self.assist.pop() #两个栈都进行弹出 return self.stack.pop() #除push都是返回型操作 def top(self): # write code here if self.stack: return self.stack[-1] def min(self): # write code here if self.assist: return self.assist[-1]
思路:
建一个辅助栈遍历Push并将其中元素依次装入,每入栈一个元素,检查辅助栈栈顶元素和pop是否相同,若相同则弹出栈顶元素并将pop里当前元素后移,不相等就一直进行入栈。
最后遍历完成,若辅助栈为空说明为true。
注意:一定要用while而不能用If,这里需要循环判断
class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { //建一个辅助栈遍历Push并将其中元素依次装入,每入栈一个元素,检查辅助栈栈顶元素和pop是否 //相同,若相同则弹出栈顶元素并将pop里当前元素后移,不相等就一直进行入栈 //最后遍历完成,若辅助栈为空说明为true if(pushV.size() == 0) return false; vector<int> stack; int j = 0; for (int i = 0; i<pushV.size(); i++){ stack.push_back(pushV[i]); //1.j < popV.size() 循环中一定要判断j是否超出索引 //在弹出所有元素后(1,2,3,4,5)与(4,5,3,2,1) j++使得j=5,这时候再进行最后一次while判断,但popV[j]就会索引错误 //2.python可以list[-1]返回最后一个元素,但vector是vec.back() while (j < popV.size()&& stack.back() == popV[j]){ stack.pop_back(); j++; } } return stack.empty(); } };