实现push,pop,max为O(1)的栈
来源:互联网 发布:质量问题淘宝怎么陪 编辑:程序博客网 时间:2024/06/16 12:48
原理
使用两个栈来实现要求: 栈的push,pop,max都为O(1)。
- 一个栈用来保存入栈数据中的最大值
- 另一个栈用来正常保存入栈和出栈的数据,它max方法用来调用第一个栈保存的当前最大值
实现
辅助栈
作用:用于保存当前最大值的栈
template<typename T>class stackMax{public: stackMax():size(0), capacity(1), data(new T[capacity]) { } ~stackMax() { if (data) delete[] data; } void push(T x) { if (size >= capacity) { resize(); } data[size++] = x; } T top() { if (size <= 0) { return T(); } return data[size-1]; } void pop() { if (size <= 0) { return; } else if (size <= capacity/4) { resize(); } size--; }private: void resize(unsigned size) { if (size >= capacity) { capacity *= 2; } else if (size <= capacity/4) { capacity /= 2; } T *copy = new T[capacity]; for (unsigned i = 0; i < size; i++) copy[i] = data[i]; delete[] data; data = copy; }private: unsigned size; unsigned capacity; T *data;};
栈实现
template<typename T>class stack{public: stack():size(0), capacity(1), data(new T[capacity]) { } ~stack() { if (data) delete[] data; } void push(T x) { if (size >= capacity) { resize(); } if (size == 0 || x > maxStack.top()) { maxStack.push(x); } else { maxStack.push(maxStack.top()); } data[size++] = x; } T top() { if (size <= 0) { return T(); } return data[size-1]; } void pop() { if (size <= 0) { return; } else if (size <= capacity/4) { resize(); } size--; maxStack.pop(); } int max() { return maxStack.top(); }private: void resize() { if (size >= capacity) { capacity *= 2; } else if (size <= capacity/4) { capacity /= 2; } T *copy = new T[capacity]; for (unsigned i = 0; i < size; i++) copy[i] = data[i]; delete[] data; data = copy; }private: unsigned size; unsigned capacity; T *data; // 用于保存当前最大值得栈 stackMax<T> maxStack;};
测试
int main(){ stack<int> si; si.push(50); si.push(30); si.push(60); si.push(80); si.push(40); cout << si.max() << endl; // 80 si.pop(); cout << si.max() << endl; // 80 si.pop(); cout << si.max() << endl; // 60}/* stack maxStack |----| |----| | 40 | | 80 | | 80 | | 80 | | 60 | | 60 | | 30 | | 50 | | 50 | | 50 | |----| |----|*/
缺点
这里的实现使用动态增长内存的方式,在push时有可能无法实现O(1)的时间复杂度。要想实现O(1)时间复杂度的push, pop,可以使用固定大小的数组来实现。
参考
实现push,pop,max为O(1)的栈
一道IT技术面试题 带有max函数的栈
0 0
- 实现push,pop,max为O(1)的栈
- 实现push,pop,max为O(1)的栈
- [WPS笔试题]实现栈的push,pop,max且时间复杂度为O(1)
- push, pop, min 都为O(1)的栈
- 实现pop push min操作时间复杂度为O(1)的栈结构
- 实现push pop min皆为O(1)的栈
- 实现一个栈,要求Push/Pop/Min(返回最小值)的时间复杂度为O(1)
- 实现一个栈的pop,push,Min(最小值),时间复杂度为O(1)
- 实现一个栈,要求push,pop,Min的操作时间复杂度为O(1)
- 实现一个栈, 其 Push,Pop,Min 操作的 时间复杂度 均为 O( 1 )
- 实现一个栈,push、pop、求栈中最小值min的时间复杂度为O(1)
- 面试题:支持O(1)时间内完成pop,push和max的栈
- 实现一个栈Stack,要求实现Push、Pop、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现包含min,max,push,pop函数的栈
- 实现一个栈Stack,Push、Pop、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈,要求pop,push,Min,时间复杂度为O(1)
- 满足min.push.pop操作时间复杂度为o(1)的栈
- 【栈队列】实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 复数字符串资源中文总是获得quantity为other的字符串
- 运算放大器输入过压保护:箝位与集
- python之连接mysql
- h5本地存储localStorage,sessionStorage
- JAVA BigInteger类 方法使用
- 实现push,pop,max为O(1)的栈
- c3p0连接池参数解释
- Unity3D Shader 新手教程(2/6) —— 积雪Shader
- php ajax生成excel并下载
- 欢迎使用CSDN-markdown编辑器
- Gmail注册电话验证失败
- 控制流
- ORA-38104: 无法更新 ON 子句中引用的列: "A"."CAMPAIGNID"
- 亲和图信息管理联想发散思维