Leetcode:栈和队列

文章目录

  • 声明
  • 栈和队列
    • 剑指offer
      • 用两个栈实现队列(剑指offer 09)
        • 题目描述
        • 分析
        • 代码
          • C++版
          • python版
      • 包含min函数的栈(剑指offer30)
        • 题目描述
        • 分析
        • 代码
          • C++版
          • python版
      • 队列的最大值(剑指offer59)
        • 题目描述
        • 分析
        • 代码
          • C++版

声明

作为做题记录,仅供参考。
转载请注明!
若有错误,欢迎指正!

栈和队列

剑指offer

用两个栈实现队列(剑指offer 09)

题目描述

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
题目链接

分析

用两个栈组成一个队列,进栈固定只进s1,出战固定只从s2出。当s2为空时,将s1全部取出放到s2中,然后从s2“出队”。只有s1、s2都为空,队列才为空。

代码
C++版
#include
class CQueue {
public:
    stack<int> *s1;
    stack<int> *s2;
    CQueue() {
        s1 = new stack<int>();
        s2 = new stack<int>();
    }
    
    void appendTail(int value) {
        s1->push(value);
    }
    
    int deleteHead() {
        if(s2->empty()){
            while(!s1->empty()){   
                s2->push(s1->top());
                s1->pop();
            }
        }
        if(s2->empty())
            return -1;
        else{
            int num = s2->top();
            s2->pop();
            return num;
        }
    }
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */
python版
class CQueue:
    def __init__(self):
        self.s1 = []
        self.s2 = []
    def appendTail(self, value: int) -> None:
        self.s1.append(value)
        
    def deleteHead(self) -> int:
        if len(self.s2) == 0:
            while len(self.s1) != 0:
                self.s2.append(self.s1.pop())
        if len(self.s2) == 0:
            return -1
        else:
            num = self.s2.pop()
            return num


包含min函数的栈(剑指offer30)

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

题目链接

分析

用两个栈组成,一个栈s存放栈本身的元素,另一个栈m存放对应的栈顶情况的最小值。当入栈的元素x小于m的栈顶元素时,x同时入s和m;当x大于等于m栈顶元素,将m的栈顶元素重复入栈。

代码
C++版
class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> * s;
    stack<int>* m;
    MinStack() {
        s = new stack<int>();
        m = new stack<int>();
        m->push(INT_MAX);

    }
    
    void push(int x) {
        if(m->top()>x){
            m->push(x);
        }else{
            m->push(m->top());
        }
        s->push(x);
    }
    
    void pop() {
        s->pop();
        m->pop();
    }
    
    int top() {
        return s->top();
    }
    
    int min() {
        return m->top();
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(x);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->min();
 */
python版
import sys
class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.s = []
        self.m = []


    def push(self, x: int) -> None:
        if len(self.m) == 0 or x<self.m[-1]:
           self.m.append(x);
        else:
            self.m.append(self.m[-1])
        self.s.append(x)

    def pop(self) -> None:
        self.s.pop()
        self.m.pop()

    def top(self) -> int:
        return self.s[-1]

    def min(self) -> int:
        return self.m[-1]

队列的最大值(剑指offer59)

题目描述

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。

若队列为空,pop_front 和 max_value 需要返回 -1

题目链接

分析

用到双端队列(使用方法)deque.

入队:如果 deque队尾元素小于即将入队的元素 value,则将小于 value 的元素全部出队后,再将 value入队;否则直接入队。(注意deque不为空)

出队:当队列出队的元素等于deque头部元素,则将deque头部元素也出队,反之则不出队。

最大元素:deque的头部元素

代码
C++版
class MaxQueue {
public:
    queue<int> *q;
    deque<int> *m;
    MaxQueue() {
        q = new queue<int>;
        m = new deque<int>;
    }
    
    int max_value() {
        if(q->empty()){
            return -1;
        }else
            return m->front();
    }
    
    void push_back(int value) {
        while(!m->empty()&&m->back()<value){
            m->pop_back();
        }
        q->push(value);
        m->push_back(value);
    }
    
    int pop_front() {
        if(q->empty()){
            return -1;
        }else{
            
            int tmp = q->front();
            if(m->front()==tmp)
                m->pop_front();
            q->pop();
            return tmp;
        }
        
    }
};

/**
 * Your MaxQueue object will be instantiated and called as such:
 * MaxQueue* obj = new MaxQueue();
 * int param_1 = obj->max_value();
 * obj->push_back(value);
 * int param_3 = obj->pop_front();
 */

你可能感兴趣的:(Leetcode,leetcode,栈,算法,c++,python)