【编程题目】设计包含 min 函数的栈
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 函数的栈的更多相关文章
- 面试经典-设计包含min函数的栈
问题:设计包含min函数的栈(栈) 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素. 要求函数min.push以及pop的时间复杂度都是O(1). 解答:push 和pop的时间复杂度 ...
- 题目21 包含Min函数的栈
///////////////////////////////////////////////////////////////////////////////////// // 3. 题目21 包含 ...
- 设计包含min()函数的栈
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:这是去年google的一道面试题. 我看到这道题目时,第一反应 ...
- 2.设计包含 min 函数的栈[StackWithMinValue]
[题目]: 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). [解法一]: 使用一个辅助栈来保存最小元素,其栈顶元素为当前栈 ...
- 【算法题目】包含min函数的栈
题目来源:<剑指offer>面试题21 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push以及pop的时间复杂度都是O(1). 分 ...
- 面试题之堆栈队列系列一:设计包含min函数的栈
编译环境 本系列文章所提供的算法均在以下环境下编译通过. [算法编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...
- MS - 2 - 设计包含 min 函数的栈
定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素. 要求函数 min.push 以及 pop 的时间复杂度都是 O(1). template<typename T> st ...
- 设计包含min函数的栈
stack<pair<int, int>> sta; void push(int x) { int min_i; if(sta.empty()) { min_i = x; } ...
- 剑指Offer面试题:19.包含Min函数的栈
一.题目:包含Min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 这里我们要实现的就是min ...
随机推荐
- Eclipse中使用tomcat 8服务器初级教程
Eclipse中使用tomcat容器时,经常遇到的问题是启动不成功,输入localhost:8080报404,本文就是教大家破解这个问题.(不过这是很初级的问题了,大牛勿喷) 步骤 1 Window- ...
- ACM3 求最值
/*2*2014.11.18*求最值*描述:给定N个整数(1<=N<=100),求出这N个数中的最大值,最小值.*输入:多组数据,第一行为一个整数N,第二行为N个不超过100的正整数,用空 ...
- Net上传附件大小控控值(转)
Server Error 404 – File or directory not found. The resource you are looking for might have been rem ...
- Ubuntu/Windows下利用“HIDAPI”库函数实现与Hid类USB设备通信
一.背景: 最近在做的一个项目需要使用USB传递数据,对USB理解不是很深,USB的系统驱动编写则更是天方 夜谭,因此将设备配置成HID类设备成为了首选.其最大的好处在于,LINUX/Windows系 ...
- explain mysql的type字段,索引的类型
4.type这列很重要,显示了连接使用了哪种类别,有无使用索引.从最好到最差的连接类型为const.eq_reg.ref.range.indexhe和ALL (1).system这是const联接类型 ...
- 从程序员到CTO的Java技术路线图
转自:http://zz563143188.iteye.com/blog/1877266 企业级项目实战地址:http://zz563143188.iteye.com/blog/1825168 开发资 ...
- Java(Android)线程池
1.new Thread的弊端执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() ...
- iOS开发——UI进阶篇(三)自定义不等高cell,如何拿到cell的行高,自动计算cell高度,(有配图,无配图)微博案例
一.纯代码自定义不等高cell 废话不多说,直接来看下面这个例子先来看下微博的最终效果 首先创建一个继承UITableViewController的控制器@interface ViewControll ...
- 如何优雅地使用 Sublime Text
Sublime Text:一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相比 于难于上手的Vim,浮肿沉重的Ecli ...
- [转载]MySQL5.5 配置文件 my.ini 1067错误
原文链接:http://blog.csdn.net/xiaochunyong/article/details/7438200 解压mysql-5.5.22-win32.zip后的目录中有5个my-xx ...