剑指Offer系列---(23)包含min函数的栈
来源:互联网 发布:mac ie浏览器 编辑:程序博客网 时间:2024/05/16 15:59
1.题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。
2.分析:
实现方法:把每次的最小元素(之前的最小元素和新压入栈的元素两者的较小值)都保存在一个辅助栈中。
3.源代码:
#include <iostream>using namespace std;class CStackElement{public: CStackElement(void){} CStackElement(int data,int min=0) { m_nData = data; m_nMin = min; } ~CStackElement(void){} public: int m_nData; int m_nMin;};class CStack{public: CStack(int maxSize);//普通构造函数,构造一个大小为maxSize的栈 CStack(const CStack &stack);//拷贝构造函数 CStack & operator=(const CStack &stack);//赋值函数 ~CStack(void); void Push(int nPushElement);//向栈中压入一个元素nElement void Pop();//从栈中弹出一个元素,并返回 int Min();//O(1)的时间返回最小元素值 private: CStackElement *m_pStackArr; int m_top;//指向栈顶元素的下一个位置 int m_nMaxSize;};//普通构造函数,构造一个大小为maxSize的栈CStack::CStack(int maxSize){ m_top = 0;//指向栈顶元素的下一个位置 m_nMaxSize = maxSize; m_pStackArr = new CStackElement[m_nMaxSize];}//拷贝构造函数CStack::CStack(const CStack &stack){ m_top = stack.m_top; m_nMaxSize = stack.m_nMaxSize; m_pStackArr = new CStackElement[m_nMaxSize]; memcpy(m_pStackArr,stack.m_pStackArr,m_nMaxSize);}//赋值函数CStack & CStack::operator=(const CStack &stack){ if(this == &stack)//自赋值检查 { return *this; } if(stack.m_top != 0) { if(m_nMaxSize <stack.m_nMaxSize) { m_nMaxSize = stack.m_nMaxSize; delete[] m_pStackArr; m_pStackArr = new CStackElement[m_nMaxSize]; memcpy(m_pStackArr, stack.m_pStackArr, m_nMaxSize); } } return *this;}//向栈中压入一个元素nElementvoid CStack::Push(int nPushElement){ if(m_top == m_nMaxSize) { cout<<"栈满!"<<endl; } else if(m_top == 0)//栈空 { m_pStackArr[m_top++].m_nData = nPushElement; m_pStackArr[m_top++].m_nMin = nPushElement; cout<<"压入"<<nPushElement<<endl; } else { if(m_pStackArr[m_top-1].m_nMin > nPushElement) { m_pStackArr[m_top].m_nMin = nPushElement; } else { m_pStackArr[m_top].m_nMin = m_pStackArr[m_top-1].m_nMin; } m_pStackArr[m_top++].m_nData = nPushElement; cout<<"压入"<<nPushElement<<endl; }}//从栈中弹出一个元素并返回void CStack::Pop(){ int nPopElement = 0; if(m_top == 0) { nPopElement = -1; cout<<"栈空!"<<endl; } else { nPopElement = m_pStackArr[--m_top].m_nData; cout<<"弹出"<<nPopElement<<endl; }}//O(1)的时间返回最小元素值int CStack::Min(){ if(m_top == 0) { cout<<"栈空!"<<endl; return -1; } else { return m_pStackArr[m_top-1].m_nMin; }}CStack::~CStack(void){ }int main(int argc,char *argv[]){ CStack stack(20); stack.Push(4); cout<<"Min:"<<stack.Min()<<endl; stack.Push(5); cout<<"Min:"<<stack.Min()<<endl; stack.Push(2); cout<<"Min:"<<stack.Min()<<endl; stack.Pop(); cout<<"Min:"<<stack.Min()<<endl; stack.Push(3); cout<<"Min:"<<stack.Min()<<endl;}
4.运行效果:
压入4Min:4压入5Min:4压入2Min:2弹出2Min:4压入3Min:3Program ended with exit code: 0
0 0
- 剑指Offer系列---(23)包含min函数的栈
- 剑指offer系列源码-包含min函数的栈
- 剑指offer系列之十九:包含min函数的栈
- 【剑指offer系列】 包含min函数的栈___21
- 剑指offer系列之19:包含min函数的栈
- 剑指offer系列-T21包含min函数的栈
- 【剑指offer】包含min函数的栈
- 剑指offer--包含min函数的栈
- 剑指Offer-->包含min函数的栈
- 《剑指offer》包含min函数的栈
- 剑指offer - 包含min函数的栈
- 剑指offer-包含min函数的栈
- 剑指offer:包含min函数的栈
- 包含min函数的栈|剑指offer
- 剑指offer-包含min函数的栈
- 剑指offer 包含min函数的栈
- 剑指offer:包含min函数的栈
- 剑指offer 包含min函数的栈
- 使用Nginx+uWSGI+Django方法部署Django程序
- C# ManualResetEvent使用测试
- iOS中UITextField 使用全面解析
- [tools][eclipse]如何進行Code Style Formatter設置
- Intent.ACTION_DIAL虚拟机上不能运行
- 剑指Offer系列---(23)包含min函数的栈
- json_encode 和 json_decode
- 单例设计模式
- debian apt-get 和 dpkg总结
- test2.5
- CMSIS RTOS-RTX信号管理
- Android 开发如何做好内存优化
- cvCreateImage和cvCreateImageHeader等函数的区别
- java中的抽象类的基本知识