首页 > 其他分享 >栈&最小栈

栈&最小栈

时间:2023-05-08 17:13:29浏览次数:21  
标签:val min int 最小 long pop push

栈是后入先出(LIFO)的数据结构,首先处理添加到队列的最新元素。

插入操作称作入栈push,在堆栈的末尾添加一个新元素。删除操作称作pop,删除最后一个元素。

动态数组即可实现堆栈。

#include <iostream>

class MyStack {
    private:
        vector<int> data;               // store elements
    public:
        /** Insert an element into the stack. */
        void push(int x) {
            data.push_back(x);
        }
        /** Checks whether the queue is empty or not. */
        bool isEmpty() {
            return data.empty();
        }
        /** Get the top item from the queue. */
        int top() {
            return data.back();
        }
        /** Delete an element from the queue. Return true if the operation is successful. */
        bool pop() {
            if (isEmpty()) {
                return false;
            }
            data.pop_back();
            return true;
        }
};

int main() {
    MyStack s;
    s.push(1);
    s.push(2);
    s.push(3);
    for (int i = 0; i < 4; ++i) {
        if (!s.isEmpty()) {
            cout << s.top() << endl;
        }
        cout << (s.pop() ? "true" : "false") << endl;
    }
}

 

一些基本操作的代码示例:

#include <iostream>

int main() {
    // 1. Initialize a stack.
    stack<int> s;
    // 2. Push new element.
    s.push(5);
    s.push(13);
    s.push(8);
    s.push(6);
    // 3. Check if stack is empty.
    if (s.empty()) {
        cout << "Stack is empty!" << endl;
        return 0;
    }
    // 4. Pop an element.
    s.pop();
    // 5. Get the top element.
    cout << "The top element is: " << s.top() << endl;
    // 6. Get the size of the stack.
    cout << "The size is: " << s.size() << endl;
}

 

最小栈:检索到最小元素的栈

设计支持push,pop,top操作,在常数时间内检索到最小元素的栈。实现MinStack类。

class MinStack {
private:
    stack<long> st;
    long min;
public:
    //初始化堆栈对象
    MinStack() { 
    }
    
    /*将元素val推入堆栈。
    如推入元素依次为1,2,6,4 -> 0,1,5,3. 3,2,4,1 -> 0,-1,2,-1.
    */
    void push(int val) {
        if(!st.empty()){
            long long diff=val-min; 
            min=diff>0 ? min:val;   //栈非空时存储与当前min的差值
            st.push(diff);
        }
        else{
            min=val;    //栈为空时将val赋值给min
            st.push(0); //栈的第一个元素为0
        }
    }
    
    void pop() {
        if(!st.empty()){
            long long diff=st.top();
            st.pop();
            if(diff<0) min-=diff; //diff为负时说明top()比当前min小,所以要更新min
        }
    }
    
    int top() {
        return st.top()<0? min:(min+st.top());
    }
    
    int getMin() {
        return min;
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

顺利运行通过,但是我没有懂得为什么这里需要定义long类型。将long和long long都改为int类型后发现示例运行结果正确,但是提交后报错: 

Line11: int diff=val-min;

Line 11: Char 25: runtime error: signed integer overflow: -2147483648 - 2147483647 cannot be represented in type 'int' (solution.cpp) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:16:25

 

标签:val,min,int,最小,long,pop,push
From: https://www.cnblogs.com/chordxx/p/17378486.html

相关文章

  • (hdu step 9.1.2)Doing Homework again(贪心——有n份作业,每份作业都有一定的完成时
    题目:DoingHomeworkagainTimeLimit:1000/1000MS(Java/Others)MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):63AcceptedSubmission(s):57 ProblemDescriptionIgnatiushasjustcomebackschoolfromthe30thACM/ICPC.Nowheha......
  • hdu 1599 find the mincost route(无向图的最小环:求从一个点遍历所有节点以后回到原点
    题目:findthemincostrouteTimeLimit:1000/2000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):2801    AcceptedSubmission(s):1115ProblemDescription杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游......
  • [每天例题]蓝桥杯 C语言 最小公倍数
    最小公倍数题目 思路分析方法一:建立两个for循环,第一个for循环求最小公倍数,第二个for循环进行1至n的排列方法二:/*最小公倍数n项可以计算前面的n-1项例如;1、2、3、4、5、6的最小公倍数=1、2、3、4、5的最小公倍数和6的最小公倍数我们定义一个贡献度:贡献度(ai)%贡献度(ai-1)==0......
  • 最小二乘法求解线性方程组公式推导
    M行N列方程组如下。其中x,y是已知量,k是未知量:$${\left\{\begin{matrix}k_{1}x_{1,1}+k_{2}x_{1,2}+\cdots+k_{N}x_{1,N}=y_{1}\\ k_{1}x_{2,1}+k_{2}x_{2,2}+\cdots+k_{N}x_{2,N}=y_{2}\\ \vdots\\ k_{1}x_{M,1}+k_{2}x_{M,2}+\cdots+k_{N}x_{M,N}=y_{M} \end{matrix......
  • 120. 三角形最小路径和
     分析:经典动态规划路径求和就是定义数组有点麻烦,写了一个循环后面还有边缘问题注意一下就行i循环从1开始,初始赋值f[0][0]=triangle[0][0]代码:classSolution(object):defminimumTotal(self,triangle):""":typetriangle:List[List[int]]......
  • 包含点集所有点的最小圆
    理论来自论文:https://www.doc88.com/p-7189543163840.html如果看不了就搜一下我的这篇博客的标题吧,至少写博客的时候是能看的用js实现了这篇论文,命名也是用ABCD比较容易对应上。红色是点,蓝色是包含所有点的最小圆初始有5个点,和对应的圆,包含这5个点。鼠标点击一个空位置可以生......
  • 209. 长度最小的子数组
     分析:这题是找满足和大于等于target的最短数组有点小问题,想用双指针做,但是写得有点糅杂了最后一组案例时间超了最后借鉴了一下题解写出来代码:1classSolution(object):2defminSubArrayLen(self,target,nums):3"""4:typetarget:int......
  • LeetCode 209. 长度最小的子数组
    题目链接:LeetCode209.长度最小的子数组本题是一个滑动窗口的题,所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。在本题中实现滑动窗口,主要确定如下三点:窗口内是什么?窗口就是满足其和≥target的长度最小的连续子数组。如何移动窗口的起......
  • 实例 042 获取一维数组最小值
      你可以使用以下代码来获取一维数组中的最小值:int[]arr={5,3,9,1,7};intmin=arr[0];for(inti=1;i<arr.length;i++){if(arr[i]<min){min=arr[i];}}System.out.println("最小值为:"+min);  在上面的代码中,我们首先初始......
  • 双指针|长度最小的子数组
    给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和≥target的长度最小的连续子数组[numsl,numsl+1,...,numsr-1,numsr],并返回其长度。如果不存在符合条件的子数组,返回0。输入:target=7,nums=[2,3,1,2,4,3]输出:2解释:子数组[4,3]是该条......