2.设计包含 min 函数的栈(栈)
定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。
要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。

我的思路:

用一个额外的元素记录最小值,push时若遇到更小的则更新。但是pop的时候遇到了问题,最小的弹出去了怎么得到下一个最小的值? 总觉得要排序,再存一个min的链。结果没达到O(1).

/*
2.设计包含 min 函数的栈(栈)
定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。
要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。
*/
#include <stdio.h>
#include <stdlib.h> typedef int Elemtype; typedef struct Stack_Elem
{
Elemtype data;
Stack_Elem * p_next;
};
typedef struct My_Stack
{
Elemtype min;
Stack_Elem * top;
}My_Stack; Elemtype Stack_Min(My_Stack S)
{
return S.min;
} void Stack_Push(My_Stack* S, Elemtype e)
{
Stack_Elem * new_element = (Stack_Elem *)malloc(sizeof(Stack_Elem));
new_element->data = e;
new_element->p_next = S->top;
S->top = new_element; S->min = (S->min < e) ? S->min : e;
} Elemtype Stack_Pop(My_Stack* S)
{
if(S == NULL)
{
printf("error");
return -;
}
Stack_Elem * pop_elem = S->top;
S->top = pop_elem->p_next;
pop_elem->p_next = NULL;
Elemtype e = pop_elem->data;
if(e == S->min)
{
Elemtype min = S->top->data;
Stack_Elem * p = S->top;
while(p->p_next != NULL)
{
if (p->data < min)
{
min = p->data;
}
p = p->p_next;
}
S->min = min;
} free(pop_elem);
return e;
} int main()
{
My_Stack S;
S.min = ;
S.top = NULL; Stack_Push(&S, );
Stack_Push(&S, );
Stack_Push(&S, );
Stack_Push(&S, );
Stack_Push(&S, ); Elemtype e = Stack_Min(S); e = Stack_Pop(&S);
e = Stack_Pop(&S); e = Stack_Min(S); return ;
}

网上找答案,突然恍然大悟,存一个最小值的栈就好了,每次遇到新的最小值就进栈,不是新最小值就不理会。这样是没问题的,如

栈中元素:3 4 2 5 6 1

min栈中的元素:3 2 1

弹出1后

栈中元素:3 4 2 5 6

min栈中的元素:3 2

弹5 6时不会影响 最小值。

网上代码:http://www.cnblogs.com/likwo/archive/2010/12/21/1912331.html

// minStatck.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <cassert> using namespace std; template<typename T>
class StackSuppliedMin{
public:
vector<T> datas;
vector<size_t> minStack; void push(T data){
datas.push_back(data);
if (minStack.empty() || data < datas[minStack.back()])
minStack.push_back(datas.size()-);
} void pop(){
assert(!datas.empty());
if (datas.back() == datas[minStack.back()])
minStack.pop_back();
datas.pop_back();
} T min(){
assert(!datas.empty() && !minStack.empty());
return datas[minStack.back()];
} void display(){
cout << "datas = ";
for (unsigned i = ; i < datas.size(); i ++)
cout << datas[i] << " ";
cout << endl;
cout << "minStack = ";
for (unsigned i = ; i < minStack.size(); i ++)
cout << datas[minStack[i]] << " ";
cout << endl;
cout << "min = " << datas[minStack.back()] << endl << endl;
}
};
void main()
{
StackSuppliedMin<int> s;
s.push();
s.display();
s.push();
s.display();
s.push();
s.display();
s.push();
s.display();
s.pop();
s.display();
s.pop();
s.display();
s.push();
s.display(); }

【编程题目】设计包含 min 函数的栈的更多相关文章

  1. 面试经典-设计包含min函数的栈

    问题:设计包含min函数的栈(栈) 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素. 要求函数min.push以及pop的时间复杂度都是O(1). 解答:push 和pop的时间复杂度 ...

  2. 题目21 包含Min函数的栈

    ///////////////////////////////////////////////////////////////////////////////////// // 3. 题目21  包含 ...

  3. 设计包含min()函数的栈

    题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:这是去年google的一道面试题. 我看到这道题目时,第一反应 ...

  4. 2.设计包含 min 函数的栈[StackWithMinValue]

    [题目]: 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). [解法一]: 使用一个辅助栈来保存最小元素,其栈顶元素为当前栈 ...

  5. 【算法题目】包含min函数的栈

    题目来源:<剑指offer>面试题21 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push以及pop的时间复杂度都是O(1). 分 ...

  6. 面试题之堆栈队列系列一:设计包含min函数的栈

    编译环境 本系列文章所提供的算法均在以下环境下编译通过. [算法编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...

  7. MS - 2 - 设计包含 min 函数的栈

    定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素. 要求函数 min.push 以及 pop 的时间复杂度都是 O(1). template<typename T> st ...

  8. 设计包含min函数的栈

    stack<pair<int, int>> sta; void push(int x) { int min_i; if(sta.empty()) { min_i = x; } ...

  9. 剑指Offer面试题:19.包含Min函数的栈

    一.题目:包含Min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 这里我们要实现的就是min ...

随机推荐

  1. 网络安全&信息安全&系统安全常用名词汇总

    拖库(脱裤) 隐写术 拖库(脱裤) 隐写术 拖库(脱裤) 隐写术 拖库(脱裤) 隐写术

  2. Ionic 常见问题及解决方案

    前言 Ionic是目前较为流行的Hybird App解决方案,在Ionic开发过程中会遇到很多常见的开发问题,本文尝试对这些问题给出解决方案. 一些常识与技巧 list 有延迟,可以在ion-cont ...

  3. 【R】如何确定最适合数据集的机器学习算法 - 雪晴数据网

          [R]如何确定最适合数据集的机器学习算法 [R]如何确定最适合数据集的机器学习算法 抽查(Spot checking)机器学习算法是指如何找出最适合于给定数据集的算法模型.本文中我将介绍八 ...

  4. No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing

    在Java中,类中的静态方法不能直接调用动态方法.只有将某个内部类修饰为静态类,然后才能够在静态类中调用该类的成员变量与成员方法.所以在不做其他变动的情况下,最简单的解决办法是将public clas ...

  5. 遇到了IAR烧写程序出错,附解决办法The stack plug-in failed to set a breakpoint on "main"

    今天做无线串口调试的时候用IAR7.51往CC2530无线模块烧程序的时候遇到了问题: 先是下载过程中有许多警告,然后就是提示无法跳断点,找不到main方法,每次烧程序都出现: The stack p ...

  6. Mac Pro 编译安装 PHP 5.6.21 及 问题汇总

    [系统环境] 操作系统:OS X 10.11.5 Xcode:7.3.1 [注意] 编译之前,需要安装 xcode.Homebrew 套件! Mac Pro 安装 Homebrew 软件包管理工具 1 ...

  7. 中国天气预报数据API收集

      {"weatherinfo":{"city":"北京","cityid":"101010100" ...

  8. ASP.NET、C#调用外部可执行exe文件--多种方案

    一. try { //方法一 //调用自己的exe传递参数 //Process proc = new Process(); //proc.StartInfo.FileName = @"D:\ ...

  9. 使用MyEclipse生成Java注释时,使用的Code Template

    设置注释模板的入口: Window->Preference->Java->Code Style->Code Template, 然后展开Comments节点就是所有需设置注释的 ...

  10. android中返回键捕获处理

    在android平台上捕获Back键事件,主要用来处理返回的相关逻辑,下列几种方法都可以捕获,如下所示: 1.获取按钮按下事件,兼容android 1.0到android 2.1,重写onKeyDow ...