剑指Offer-第1天 栈与队列(简单)

第一题

题目链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/

个人题解:双栈,一个当作,一个当作输出。

  1. 将一个栈当作输入栈,用于压入数,另一个栈当作输出栈,用于弹出数。
  2. 当我们需要删除时 \(deleteHead\) ,输出栈如果为空,则依次压入输出栈。
点击查看代码
class CQueue {
public:
    stack<int> c1,c2;
    CQueue() {
        while(!c1.empty()) c1.pop();
        while(!c2.empty()) c2.pop();
    }
    
    void appendTail(int value) {
        c1.push(value);
    }
    
    int deleteHead() {
        if(c2.empty())
        {
            while(!c1.empty())
            {
                c2.push(c1.top());
                c1.pop();
            }
        }
        if(c2.empty()) return -1;
        else
        {
            auto x1=c2.top();
            c2.pop();
            return x1;
        }
    }
};

image

第二题

题目链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/

个人题解:双栈,一个栈实现普通的操作,另一个栈(单调栈)实现找最小值。

  1. 需要维护一个单调栈,来实现返回最小值的操作。
  2. 当一个元素要入栈时,取出数,如果该数 \(\le\) 单调栈的栈顶元素,则将该数同时压入单调栈中;
  3. 当一个元素要出栈时,辅助栈的栈顶元素也一并弹出;
  4. 因为我们的辅助栈是单调栈,单调栈具有单调性,所以它的栈顶元素就是当前栈中的最小数。
我的代码
class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> now,mins;
    MinStack() {

    }
    
    void push(int x) {
        now.push(x);
        if(mins.empty() || mins.top()>=x) mins.push(x);
    }
    
    void pop() {
        if(mins.top()==now.top()) mins.pop();
        now.pop();
    }
    
    int top() {
        return now.top();
    }
    
    int min() {
        return mins.top();
    }
};

结果:
image

posted @ 2022-05-03 23:07  黑VS白-清墨  阅读(25)  评论(0)    收藏  举报