您的位置:首页 > 理论基础 > 数据结构算法

数据结构和算法经典100题-第2题

2015-03-29 02:33 232 查看
题目2

设计包含min 函数的栈。

定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。

要求函数min、push 以及pop 的时间复杂度都是O(1)。

题目分析

这是一个传统的经典题目,设计一个栈结构,提供时间复杂度是O(1)的三个方法:min、push、pop。

push和pop两个方法时间复杂度是O(1)很容易实现。而min方法的时间复杂度是O(1),则要求我们在获取最小值时不能遍历栈内元素(若遍历栈内元素,则min的时间复杂度是O(n))。这里我想到的方法是设计一个缓存的栈,记录下最小值。在原栈pop和push操作时,同步更新缓存栈的内容。

缓存栈的基本思想如下图所示:



栈的基本结构图

有了以上的分析,min、pop和push方法很容易实现,实现的代码如下:

#include <stdio.h>
#include <vector>
#include <iostream>
usingnamespacestd;

template<typename T>
class stackMin {
public:
stackMin() { m_top = -1;};/* top = -1表示栈为空 */
~stackMin(){};
bool pop(T & value){
if (-1 == m_top ) {
returnfalse;
}
value = m_obj.back();
m_obj.pop_back();
m_cache.pop_back();
m_top--;
returntrue;
}

bool push(T & value){
T tmp;
if (m_cache.empty()) {
tmp = value;
} else {
tmp = m_cache.back();
}

if (value < tmp) {
tmp = value;
}
m_cache.push_back(tmp);
m_obj.push_back(value);
m_top++;
returntrue;

}

T & min() {
returnm_cache.back();
}
private:
int m_top;
vector<T> m_obj;
vector<T> m_cache;
};
int test_2();

#endif


下面是对以上代码的测试代码:

int test_2() {
stackMin<int> obj;
int popValue = 0;
int a[] = {10,7,3,3,8,5,2,6};
printf("Pushing,min of value: \n");
for (int i = 0; i < 8; i++) {
obj.push(a[i]);
printf("push(%d),min(%d)\n",a[i],obj.min());
}

printf("\n Poping \n");
for (int i = 0; i < 8; i++) {
printf("pop(%d),min(%d)\n",popValue,obj.min());
obj.pop(popValue);
}
printf("\n");

return 0;
}
int main(void) {
test_2();
}


测试结果的打印输出:

打印输出:

Pushing,min of value:

push(10),min(10)

push(7),min(7)

push(3),min(3)

push(3),min(3)

push(8),min(3)

push(5),min(3)

push(2),min(2)

push(6),min(2)

Poping

pop(0),min(2)

pop(6),min(2)

pop(2),min(3)

pop(5),min(3)

pop(8),min(3)

pop(3),min(3)

pop(3),min(7)

pop(7),min(10)

Okay,到这里第二道题解决完毕,路漫漫还有98道题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构和算法