[剑指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();
    }
};
原文地址:https://www.cnblogs.com/nicetoseeyou/p/10447674.html