时间复杂度为O(1),求栈最大最小值和pop,push操作
2008-07-04 17:35
323 查看
时间复杂度为O(1),求栈最大最小值和pop,push操作
#ifndef _MSTACK
#define _MSTACK
#include <stdio.h>
template<class T>
struct MStack{
MStack<T>* prev;
T Data;
};
template<class T>
class CMStack{
public:
CMStack(){
top =NULL;
count =0;
MaxTop =NULL;
MinTop =NULL;
};
T pop();
void Push(T Value);
T GetMaxValue();
T GetMinValue();
int GetCount();
private:
MStack<T>* top;
MStack<T>* MaxTop;
MStack<T>* MinTop;
T Data;
int count;
void MaxPush(T);
void MinPush(T);
void MaxPop();
void MinPop();
};
template<class T>
T CMStack<T>::pop(){
if (count ==0) {
return NULL;
}
T data;
MStack<T>* temp =top;
top =top->prev;
data =temp->Data;
delete temp;
temp =NULL;
if(data ==GetMaxValue() && MaxTop !=NULL){
MaxPop();
}
if(data ==GetMinValue() && MinTop !=NULL){
MinPop();
}
return data;
}
template<class T>
void CMStack<T>::Push(T value){
if (top ==NULL) {
top =new MStack<T>;
top->prev =NULL;
top->Data =value;
count ++;
}else{
MStack<T>* temp =new MStack<T>;
temp->Data =value;
temp->prev =top;
count++;
top =temp;
temp =NULL;
}
if (MaxTop == NULL) {
MaxPush(value);
}else if(value >=GetMaxValue()){
MaxPush(value);
}
if (MinTop == NULL) {
MinPush(value);
}else if(value <= GetMinValue()){
MinPush(value);
}
};
template<class T>
void CMStack<T>::MaxPop(){
if(MaxTop == NULL) return;
MStack<T>* temp =MaxTop;
MaxTop =MaxTop->prev;
temp->prev =NULL;
delete temp;
temp =NULL;
};
template<class T>
void CMStack<T>::MinPop(){
if(MinTop == NULL) return;
MStack<T>* temp =MinTop;
MinTop =MinTop->prev;
temp->prev =NULL;
delete temp;
temp =NULL;
};
template<class T>
void CMStack<T>::MaxPush(T val){
if (MaxTop ==NULL) {
MaxTop =new MStack<T>;
MaxTop->prev =NULL;
MaxTop->Data =val;
return ;
}
MStack<T>* temp =new MStack<T>;
temp->Data =val;
temp->prev =MaxTop;
MaxTop =temp;
temp =NULL;
};
template<class T>
void CMStack<T>::MinPush(T val){
if (MinTop ==NULL) {
MinTop =new MStack<T>;
MinTop->prev =NULL;
MinTop->Data =val;
return ;
}
MStack<T>* temp =new MStack<T>;
temp->Data =val;
temp->prev =MinTop;
MinTop =temp;
temp =NULL;
};
template<class T>
T CMStack<T>::GetMaxValue(){
return MaxTop->Data;
}
template<class T>
T CMStack<T>::GetMinValue(){
return MinTop->Data;
};
template<class T>
int CMStack<T>::GetCount(){
return count;
};
#endif
调试:
C/C++ code
#include "MStack.h"
#include <iostream>
using namespace std;
int main()
{
CMStack<int> s;
// for(int i =0;i<10;++i)
// s.Push(i % 5);
s.Push(6);s.Push(4);s.Push(2);s.Push(3);s.Push(7);s.Push(1);s.Push(6);s.Push(7);s.Push(8);s.Push(10);
s.Push(5);s.Push(9);s.Push(12);s.Push(13);s.Push(22);s.Push(1);s.Push(16);s.Push(17);s.Push(18);s.Push(10);
for (int i =0;i<s.GetCount() ;i++){
if(i ==8) {
s.Push(20);
cout<<"Push:"<<20<<endl;
}
if(s.GetCount()>0){
cout<<"Max Value:"<<s.GetMaxValue()<<";Min value:"<<s.GetMinValue()<<endl;
}
cout<<"Pop:"<<s.pop()<<endl;
}
return 0;
}
#ifndef _MSTACK
#define _MSTACK
#include <stdio.h>
template<class T>
struct MStack{
MStack<T>* prev;
T Data;
};
template<class T>
class CMStack{
public:
CMStack(){
top =NULL;
count =0;
MaxTop =NULL;
MinTop =NULL;
};
T pop();
void Push(T Value);
T GetMaxValue();
T GetMinValue();
int GetCount();
private:
MStack<T>* top;
MStack<T>* MaxTop;
MStack<T>* MinTop;
T Data;
int count;
void MaxPush(T);
void MinPush(T);
void MaxPop();
void MinPop();
};
template<class T>
T CMStack<T>::pop(){
if (count ==0) {
return NULL;
}
T data;
MStack<T>* temp =top;
top =top->prev;
data =temp->Data;
delete temp;
temp =NULL;
if(data ==GetMaxValue() && MaxTop !=NULL){
MaxPop();
}
if(data ==GetMinValue() && MinTop !=NULL){
MinPop();
}
return data;
}
template<class T>
void CMStack<T>::Push(T value){
if (top ==NULL) {
top =new MStack<T>;
top->prev =NULL;
top->Data =value;
count ++;
}else{
MStack<T>* temp =new MStack<T>;
temp->Data =value;
temp->prev =top;
count++;
top =temp;
temp =NULL;
}
if (MaxTop == NULL) {
MaxPush(value);
}else if(value >=GetMaxValue()){
MaxPush(value);
}
if (MinTop == NULL) {
MinPush(value);
}else if(value <= GetMinValue()){
MinPush(value);
}
};
template<class T>
void CMStack<T>::MaxPop(){
if(MaxTop == NULL) return;
MStack<T>* temp =MaxTop;
MaxTop =MaxTop->prev;
temp->prev =NULL;
delete temp;
temp =NULL;
};
template<class T>
void CMStack<T>::MinPop(){
if(MinTop == NULL) return;
MStack<T>* temp =MinTop;
MinTop =MinTop->prev;
temp->prev =NULL;
delete temp;
temp =NULL;
};
template<class T>
void CMStack<T>::MaxPush(T val){
if (MaxTop ==NULL) {
MaxTop =new MStack<T>;
MaxTop->prev =NULL;
MaxTop->Data =val;
return ;
}
MStack<T>* temp =new MStack<T>;
temp->Data =val;
temp->prev =MaxTop;
MaxTop =temp;
temp =NULL;
};
template<class T>
void CMStack<T>::MinPush(T val){
if (MinTop ==NULL) {
MinTop =new MStack<T>;
MinTop->prev =NULL;
MinTop->Data =val;
return ;
}
MStack<T>* temp =new MStack<T>;
temp->Data =val;
temp->prev =MinTop;
MinTop =temp;
temp =NULL;
};
template<class T>
T CMStack<T>::GetMaxValue(){
return MaxTop->Data;
}
template<class T>
T CMStack<T>::GetMinValue(){
return MinTop->Data;
};
template<class T>
int CMStack<T>::GetCount(){
return count;
};
#endif
调试:
C/C++ code
#include "MStack.h"
#include <iostream>
using namespace std;
int main()
{
CMStack<int> s;
// for(int i =0;i<10;++i)
// s.Push(i % 5);
s.Push(6);s.Push(4);s.Push(2);s.Push(3);s.Push(7);s.Push(1);s.Push(6);s.Push(7);s.Push(8);s.Push(10);
s.Push(5);s.Push(9);s.Push(12);s.Push(13);s.Push(22);s.Push(1);s.Push(16);s.Push(17);s.Push(18);s.Push(10);
for (int i =0;i<s.GetCount() ;i++){
if(i ==8) {
s.Push(20);
cout<<"Push:"<<20<<endl;
}
if(s.GetCount()>0){
cout<<"Max Value:"<<s.GetMaxValue()<<";Min value:"<<s.GetMinValue()<<endl;
}
cout<<"Pop:"<<s.pop()<<endl;
}
return 0;
}
相关文章推荐
- 常用数据结构2——栈,实现PUSH、POP和取最小值操作算法时间复杂度为o(1)
- 求最大值最小值的方法 时间复杂度O(n)
- 查找数组最大值最小值:时间复杂度最多为:o(3n/2)
- 求最大值最小值的方法 时间复杂度O(n)
- 随笔:设计一个栈结构,使得取出栈中最大值时间复杂度为O(1)
- C++解决最大子列和问题,算法时间复杂度优化
- 实现一个栈,要求实现一个push,pop,min(返回最小值)的时间复杂度为0(1)
- 实现一个栈,push、pop、求栈中最小值min的时间复杂度为O(1)
- node js 下查找数组最大最小值 时间复杂度 1.5N 思路来自编程之美
- 实现时间复杂度为O(1)的Push,Pop,Min
- 扩展堆栈(stack) O(1) 时间访问栈中最小值(或最大值)
- 数据结构之---求最大字段和, 时间复杂度o(n)算法
- 给定无序自然数数组,求最大连续自然数个数,时间复杂度为O(n)
- 数组连续子序列的最大的和-四种算法,四种时间复杂度
- 同时找出数组的最大值和最小值,要求时间复杂度为o(n)
- 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、 Min(返回最小值的操作)的时间复杂度为O(1)
- 算法2_实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值,时间复杂度都为O(1)(keep it up)
- 有 n 个无序整数( n>10000), 则找出其中最大的 M 个数字( 5<M<10), 所需要的最小时间复杂度为:
- 自定义栈-pop-push-min-时间复杂度都为O(1)
- 实现一个栈,要求Push(入栈),Pop(出栈),Min(返回最小值的操作)的时间复杂度为O(1)