剑指OFFER之包含min函数的栈

题目描述:

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

输入:

输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数。
接下来有n行,每行开始有一个字母Ci。
Ci=’s’时,接下有一个数字k,代表将k压入栈。
Ci=’o’时,弹出栈顶元素。

输出:

对应每个测试案例中的每个操作,
若栈不为空,输出相应的栈中最小元素。否则,输出NULL。

样例输入:
7
s 3
s 4
s 2
s 1
o
o
s 0
样例输出:
3
3
2
1
2
3
0

Code:
#include <iostream>
#include <cstdio>
#include <stack>

using namespace std;

int main()
{
    int n;
    char operation;
    stack<int> stack1,stack2;
    while(cin>>n){
        int k,minVal;
        bool isFirst=true;
        getchar();
        while(stack1.empty()==false)
            stack1.pop();
        while(stack2.empty()==false)
            stack2.pop();
        for(int cnt=0;cnt<n;++cnt){
            cin>>operation;
            if(operation==‘s‘){
                cin>>k;
                if(isFirst){
                    minVal=k;
                    isFirst=false;
                }else{
                    if(k<minVal)
                        minVal=k;
                }
                cout<<minVal<<endl;
                stack1.push(k);
                stack2.push(minVal);
            }
            if(operation==‘o‘){
                if(stack1.empty()==true&&stack2.empty()==true){
                    cout<<"NULL"<<endl;
                    isFirst=true;           //当stack为空的时候要把isFirst重新置为true
                }else{
                    stack1.pop();           //题目要求是先出栈,再把栈顶元素输出
                    stack2.pop();
                    if(stack1.empty()==true&&stack2.empty()==true){  //这个时候2个stack还是有可能为空
                        cout<<"NULL"<<endl;
                        isFirst=true;
                    }else{
                        int topVal=stack2.top();
                        minVal=topVal;     //修改栈顶元素弹出后stack2中的最小值
                        cout<<topVal<<endl;
                    }
                }
            }
        }
    }
    return 0;
}

/**************************************************************
    Problem: 1522
    User: lcyvino
    Language: C++
    Result: Accepted
    Time:120 ms
    Memory:1524 kb
****************************************************************/

时间: 2024-10-02 21:59:25

剑指OFFER之包含min函数的栈的相关文章

剑指Offer 20. 包含min函数的栈 (栈)

题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 题目地址 https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49?tpId=13&tqId=11173&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 思路 使用两个栈,一个为数据栈,一个

[剑指offer] 20. 包含min函数的栈

题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 利用两个栈,一个栈来正常保存所有元素,另一个栈作为辅助.仅在以下情况使用: push: 当辅助栈为空,或者辅助栈顶元素大于入栈元素时,辅助栈也push(value) pop: 当辅助栈顶元素等于主栈顶元素时,辅助栈也pop() min: 返回辅助栈栈顶元素 class Solution { public: stack<int> sta1; stack<int> sta2

剑指offer:包含min函数的栈

题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 解题思路: 相当与在保留原栈的同时,去维护一个最小栈.利用一个辅助栈来完成.对于每个新输入的数,在压入原栈的同时,需要去判断是否为最小值,若为最小指,则压入辅助栈,否则将当前最小值压入辅助栈.这样就相当于两个栈的大小是相等的,每次做push和pop操作时,二者需要同步.最后的min函数只需要取辅助栈的top就可以. 代码: class Solution { public: stac

【剑指offer】包括min函数的栈

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26064213 剑指offer上的第21题,之前在Cracking the Coding interview上做过,思路參考这里,这次写了測试函数,在九度OJ上測试通过. 题目描写叙述: 定义栈的数据结构,请在该类型中实现一个可以得到栈最小元素的min函数. 输入: 输入可能包括多个測试例子,输入以EOF结束.对于每一个測试案例,输入的第一行为一个整数n(1<=n<=1000000),

包含min函数的栈-剑指Offer

包含min函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数 思路 使用一个辅助栈,跟踪原始栈中每个元素在栈口时的该栈的最小值 代码 import java.util.Stack; public class Solution { Stack<Integer> s_data = new Stack(); Stack<Integer> s_min = new Stack(); public void push(int node) { s_data.

剑指offer系列源码-包含min函数的栈

题目1522:包含min函数的栈 时间限制:1 秒内存限制:128 兆特殊判题:否提交:1495解决:476 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数. 接下来有n行,每行开始有一个字母Ci. Ci='s'时,接下有一个数字k,代表将k压入栈. Ci='o'时,弹出栈顶元素. 输出: 对应每个测

剑指Offer对答如流系列 - 包含min函数的栈

面试题30:包含min函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 问题分析 push 和 pop均容易实现. 主要就是min函数的定义,如果要通过操作push和pop操作获取最小元素时间复杂度为O(1),基本上是不可能的. 如果我们另外定义一个成员变量 专门存储最小元素的值,但是当最小元素弹出后,min就需要相应改变,所以必须把每次的最小值都存储下来.这个时候不得不考虑采用一个辅助栈

【剑指offer】【栈】30.包含min函数的栈

包含min函数的栈 维护两个栈:栈st存储所有元素,minSt是一个单调栈,栈顶元素为min 1. 入栈:st.push(x); 若minSt.top >= x或minSt为空,x入栈minSt 2. 出栈:若minSt与st栈顶元素相同,则二者都出栈,否则st出栈 3. 获取最小值:若minSt不为空,返回minSt栈顶元素 class MinStack { public: stack<int> st; stack<int> minSt; /** initialize yo

包含min函数的栈 + 栈的压入、弹出序列

剑指offer 两道关于 数据结构——栈 的题目 1. 包含min函数的栈 简要分析一下这道题,这道题做了3遍才过,踩了一些小坑 看看示例: 得到了规律,那么关键部分的代码实现,就在于 两个栈(rawStack 和 minStack) 和 push() 方法 Stack<Integer> rawStack = new Stack<>(); Stack<Integer> minStack = new Stack<>(); public void push1(i