剑指offer:包含min函数的栈

剑指offer上的第21题,之前在Cracking the Coding interview上做过,思路参考这里,这次写了测试函数,在九度OJ上测试通过。

题目描述:

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的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

AC代码:

/*
本程序采用数组模拟栈
*/
typedef int ElemType;
#define MAX 100000  //栈的深度
#include<stdio.h>
#include<stdbool.h>  

int top = -1;
/*
在栈顶索引指针为top时,向栈A中压入数据data
*/
bool push(int *A,ElemType data)
{
    if(top>=MAX-1 || top<-1)
        return false;  

    A[++top] = data;
    return true;
}  

/*
在栈顶索引指针为top时,出栈
*/
bool pop()
{
    if(top<0)
        return false;  

    top--;
    return true;
}  

/*
栈顶当前索引指针为top,Min数组最大深度也为MAX,
返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/
且Min的有效元素数与栈A中的元素个数相同,
它的对应位置用来保存栈A对应位置到栈底这一部分元素中的最小值
*/
void minAll(int *A,int *Min)
{
    if(top>MAX-1)
        return ;
    Min[0] = A[0];
    int i;
    for(i=1;i<=top;i++)
    {
        if(Min[i-1] > A[i])
            Min[i] = A[i];
        else
            Min[i] = Min[i-1];
    }
}  

/*
返回栈顶为top时栈中元素的最小值
*/
int min(int *Min)
{
    return Min[top];
}  

int main()
{  

    int n;
    int A[MAX];
    int Min[MAX];  

    while(scanf("%d",&n) != EOF)
    {
        int i;
        for(i=0;i<n;i++)
        {
            char ci;
            while(getchar() != '\n')
                continue;
            scanf("%c",&ci);
            if(ci == 's')
            {
                ElemType k;
                scanf("%d",&k);
                push(A,k);
            }
            if(ci == 'o')
            {
                pop();
            }  

            minAll(A,Min);
            if(top<0)
                printf("NULL\n");
            else
                printf("%d\n",min(Min));
        }
    }
    return 0;
}

作者:csdn博客 兰亭风雨

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据结构
, 测试
, 函数
, oj
, 输入
, offer比较
, offer
, c++ offer
, offer选择
一个
,以便于您获取更多的相关知识。

时间: 2024-10-26 13:48:08

剑指offer:包含min函数的栈的相关文章

[程序员面试题精选100题]2.设计包含min函数的栈

[题目] 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). [分析] 是去年google的一道面试题. 我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序.这样栈顶元素将是最小元素.但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了. 在栈里添加一个成员变量存放最小元素(或最小元素的位置).每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则

[剑指Offer]9.用两个栈实现队列

题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 用栈来模拟队列.我们首先插入一个元素a到stack1中,再压入两个元素bc,此时栈中有元素abc,其中c位于栈顶,而stack2仍然为空.我们试着删除一个元素.按照队列先进先出的原则,我们应该先删除元素a.元素a存放在stack1中且不在栈顶,因此不能直接删除.注意到stack2还未使用,我们把stack1中的元素逐个弹出并压入stack2中,stack2中的元素是cba,栈顶元素是a,我们现在可以

剑指offer系列之十九:包含min函数的栈

题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数.要求时间复杂度是O(1). 还是先说一下思路吧,因为每次方元素进栈的时候不能保证栈顶元素都是最小的,所以需要想办法使得栈顶元素始终是最小的元素,排序是一种思路,但是每次排序还设计重新出栈和入栈,想来应该不是这样的.一种思路是可以利用一个辅助栈,相当于是以空间换时间了.具体思路是:当入栈的新元素原先栈顶元素小的话就该元素放入一个辅助栈中,如果新入栈的元素比原先栈顶元素大,则在辅助栈中继续放原先最小的元素.这样一直放下去

《剑指offer》-包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. class Solution{ public: void push(int value){ v.push_back(value); } void pop(){ v.pop_back(); } int top(){ return v[v.size()-1]; } int min(){ int m = v[0]; for (int i = 1; i < v.size(); i++){ if (v[i] < m){ m = v[

包含min函数的栈和两个栈实现一个队列

题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:这是google的一道面试题. 看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序.这样栈顶元素将是最小元素.但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了.在栈里添加一个成员变量存放最小元素(或最小元素的位置).每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素.

《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

弱菜刷题还是刷中文题好了,没必要和英文过不去,现在的重点是基本代码能力的恢复. [题目] 剑指offer 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 直觉想到用二进制的位运算.最后写出来是一个迭代的过程. 每次迭代先计算x和y的和但不处理进位,那么相当于做异或,得到res1 然后处理进位问题,相当于计算与运算,得到res2 那么res2左移1位,再加到res1上,则整个运算的最终结果转化为res1+(res2<<1) 因为res2做左移,总会减小到

剑指offer:栈的压入弹出序列

剑指offer上的第22题,九度OJ上AC. 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入: 每个测试案例包括3行: 第一行为1个整数n(1<=n<=100000),表示序列的长度. 第二行包含n个整数,表示栈的压入顺序. 第三行包含n个整数,表示栈的弹出顺序

剑指offer之字符串转整数

题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n<=10000000). 输出: 对应每个测试案例, 若输入为一个合法的字符串(即代表一个整数),则输出这个整数. 若输入为一个非法的字符串,则输出"My God". 样例输入:5-5+8样例输出:5-58    关于这道题目,题目本身还是不错的,真正核心的代码也就那么两行,大部分代码基

[剑指Offer]7.从尾到头打印链表

题目1511:从尾到头打印链表 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:1082 解决:350 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推.当输入到-1时代表链表输入完毕.-1本身不属于链表. 输出: 对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行. 样例输入: 1 2 3 4 5 -1 样例输出