zoukankan      html  css  js  c++  java
  • [剑指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();
        }
    };
  • 相关阅读:
    虚拟机Linux5下安装MyEclipse2014的步骤
    鉴赏
    Linux环境下安装WebStorm
    Bootstrap模态框
    AngularJs
    按钮颜色
    虚拟机里的weblogic之后怎样进入
    搭建GlusterFS文件系统
    邮件服务器fixpost服务(1)
    unbound域名解析
  • 原文地址:https://www.cnblogs.com/nicetoseeyou/p/10447674.html
Copyright © 2011-2022 走看看