面试题之堆栈队列系列一:设计包含min函数的栈
编译环境
本系列文章所提供的算法均在以下环境下编译通过。
【算法编译环境】Federa 8,linux 2.6.35.6-45.fc14.i686
【处理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
【内存】 2025272 kB
前言
这是一道经常遇见的面试题。好像网易和google都曾出过此题。这道题解法也胜多。这里给出普遍的一种解法。即增加一个辅助堆栈来存储最小值。
本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。
正文
【题目】
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
【例子】
【分析】
我第一次看到这个题目的时候,想用一个min变量保存最小的值就不OK了。再一想,如果这个最小元素被pop出去了,怎么办呢?
因此仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。我们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。
【代码】
#ifndef STACK_HPP
#define STACK_SIZE 20
typedef struct {
int data[STACK_SIZE];
int top;
int min;
}Stack;
void init( Stack *s );
void push( Stack *s, int val );
int pop( Stack *s );
bool full( Stack *s );
bool empty( Stack *s );
int min( Stack *s );
#endif
#include <iostream>
#include <cstdio>
#include <cstring>
#include "stack.hpp" Stack assist; void init( Stack *s )
{
s->top = -;
s->min = -; assist.top = -;
} void push( Stack *s ,int val )
{
if( full(s) )
{
printf("%s\n", "stack is full");
return;
}
if( (s->min == -) || (val < s->min) )
{
s->min = val;
assist.data[++assist.top] = val;
}
s->data[++s->top] = val;
} int pop( Stack *s )
{
int data;
if( empty(s) )
{
printf( "%s\n", "stack is empty" );
return -;
}
data = s->data[s->top--];
if( data == assist.data[assist.top] )
{
s->min = assist.data[--assist.top];
}
return data;
} bool full( Stack *s )
{
if( s->top == STACK_SIZE- )
{
return true;
}
return false;
} bool empty( Stack *s )
{
if( s->top == - )
{
return true;
}
return false;
} int min( Stack *s )
{
return s->min;
} int main( int argc, char ** argv )
{
Stack s;
init( &s );
push( &s, );
std::cout << min( &s ) << std::endl;
push( &s, );
std::cout << min( &s ) << std::endl;
push( &s, );
std::cout << min( &s ) << std::endl;
push( &s, );
std::cout << min( &s ) << std::endl;
pop( &s );
std::cout << min( &s ) << std::endl;
pop( &s );
std::cout << min( &s ) << std::endl;
push( &s, );
std::cout << min( &s ) << std::endl;
return ;
}
【结论】
我们做如下测试:
| 步骤 | 数据栈 | 辅助栈 | 最小值 |
| 1 | 3 | 3 | 3 |
| 2 | 3,4 | 3 | 3 |
| 3 | 3,4,2 | 3,2 | 2 |
| 4 | 3,4,2,1 | 3,2,1 | 1 |
| 5 | 3,4,2 | 3,2 | 2 |
| 6 | 3,4 | 3 | 3 |
| 7 | 3,4,0 | 3,0 | 0 |
作者
出处:http://www.cnblogs.com/gina
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
面试题之堆栈队列系列一:设计包含min函数的栈的更多相关文章
- 【编程题目】设计包含 min 函数的栈
2.设计包含 min 函数的栈(栈)定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素.要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 我的思路: 用一个额外的 ...
- 面试经典-设计包含min函数的栈
问题:设计包含min函数的栈(栈) 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素. 要求函数min.push以及pop的时间复杂度都是O(1). 解答:push 和pop的时间复杂度 ...
- 设计包含min()函数的栈
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:这是去年google的一道面试题. 我看到这道题目时,第一反应 ...
- MS - 2 - 设计包含 min 函数的栈
定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素. 要求函数 min.push 以及 pop 的时间复杂度都是 O(1). template<typename T> st ...
- 2.设计包含 min 函数的栈[StackWithMinValue]
[题目]: 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). [解法一]: 使用一个辅助栈来保存最小元素,其栈顶元素为当前栈 ...
- 设计包含min函数的栈
stack<pair<int, int>> sta; void push(int x) { int min_i; if(sta.empty()) { min_i = x; } ...
- 面试题三:设计包括 min 函数的栈。
3.设计包括 min 函数的栈. 定义栈的数据结构,要求加入一个 min 函数.可以得到栈的最小元素. 要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 思路分析: a.要想一个 ...
- 【面试题021】包含min函数的栈
[面试题021]包含min函数的栈 MinStack.cpp: 1234567891011121314151617181920212223242526272829303132333435363738 ...
- 剑指offer——面试题30:包含min函数的栈
#include"iostream" #include"stdio.h" using namespace std; ; ; template<typena ...
随机推荐
- HDU.1233 还是畅通工程(Prim)
HDU.1233 还是畅通工程(Prim) 题意分析 首先给出n,代表村庄的个数 然后出n*(n-1)/2个信息,每个信息包括村庄的起点,终点,距离, 要求求出最小生成树的权值之和. 注意村庄的编号从 ...
- HDOJ(HDU).1025 Constructing Roads In JGShining's Kingdom (DP)
HDOJ(HDU).1025 Constructing Roads In JGShining's Kingdom (DP) 点我挑战题目 题目分析 题目大意就是给出两两配对的poor city和ric ...
- 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)
------------------------------------------------------------------------------------ 17/24 --------- ...
- 将Visual Studio项目转换为Dot Net Core项目 csproj to xproj
删除csproj文件. 将 package.config 重命名为 project.json . 转换文件,将xml转换为json格式. <?xml version="1.0" ...
- windows下vue项目启动步骤
原创:https://blog.csdn.net/qq_27680317/article/details/71123051?locationNum=10&fps=1 不是ngnix服务器是,忽 ...
- HDU 5249 离线树状数组求第k大+离散化
KPI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Java的四种引用?用到的场景?
在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分 ...
- swift的一些东西
.cmd+k 键盘toggle .模拟器的handware设置ios键盘 .设置textfield的return类型为搜索 k.returnKeyType=UIReturnKeyType.search ...
- Saddle Point ZOJ - 3955 题意题
Chiaki has an n × m matrix A. Rows are numbered from 1 to n from top to bottom and columns are numbe ...
- 【题解】最大公约数之和 V3 51nod 1237 杜教筛
题目传送门 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237 数学题真是做的又爽又痛苦,爽在于只要推出来公式基本上就 ...