求栈的最小元素
来源:互联网 发布:服务器交换机端口号 编辑:程序博客网 时间:2024/06/05 17:39
题目来源:http://bbs.csdn.net/topics/350118968
2.设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
思路:
我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。
在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。
乍一看这样思路挺好的。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能得到下一个最小元素?
因此仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。我们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。
#include <iostream>#include <string.h>#include <stdio.h>#define MAXSIZE 1000using namespace std;struct stack{ int data[MAXSIZE]; int top;};void init(stack *a, stack *b){ a->top = 0; b->top = 0;}void push(stack *a, stack *b, int value){ a->data[a->top] = value; a->top++; if(b->top == 0) b->data[b->top] = value; else if(b->data[b->top-1] > value) { b->data[b->top] = value; } else { b->data[b->top] = b->data[b->top-1]; } b->top++;}void pop(stack *a, stack *b){ a->top--; b->top--;}void min(stack *b){ cout << b->data[b->top-1] << endl;}int main(){ stack a, b; init(&a, &b); push(&a, &b, 3); push(&a, &b, 4); push(&a, &b, 2); push(&a, &b, 1); pop(&a, &b); pop(&a, &b); push(&a, &b, 0); min(&b); return 0;}
模版实现参考:
http://zhedahht.blog.163.com/blog/static/25411174200712895228171/
- 求栈的最小元素
- 利用差值求栈的最小元素
- O(1)时间复杂度求栈的最小元素
- O(1)时间复杂度求栈的最小元素
- 求数组中绝对值最小的元素
- 求最小的k个元素
- 求N的元素中最小的两个元素
- 求K个最小元素
- C语言强化(二)设计可以求最小元素的栈
- 用时间复杂度O(1)的算法求栈中的最小元素
- 如何在O(1)的时间复杂度求栈中的最小数据元素:
- 求升序数组中绝对值最小的元素
- 【谷歌面试题】求数组中两个元素的最小距离
- 求数组中两个元素的最小距离
- C语言 求旋转数组的最小元素
- 求数组中两个元素的最小距离
- 包含最小元素的栈
- 得到栈的最小元素
- T-SQL查询进阶--基于列的逻辑表达式
- T-SQL查询进阶--变量
- CV
- pdf介绍及pdf相关软件(内容来自百度百科)
- C#获取执行程序所在的当前路径的方法
- 求栈的最小元素
- 2013 多校第九场 hdu 4686 Arc of Dream(矩阵乘法或者直接推公式)
- ubuntu安装中文输入法
- EditText 总结
- IDA 断点设置里,地址前得加上0x
- hdu 3466 Proud Merchants(DP)
- va_list可变参数原理及vsprintf函数
- Codility上的问题 (16) Omicron 2012
- ios 制作 framework小结