面试题21 包含min函数的栈


CStack.h:

[cpp]  view plain copy
  1. #pragma once  
  2.   
  3. class CStackElement  
  4. {  
  5. public:  
  6.     CStackElement(void){}  
  7.     CStackElement(int data, int min=0)  
  8.     {  
  9.         m_nData = data;  
  10.         m_nMin = min;         
  11.     }  
  12.   
  13.     ~CStackElement(void){}  
  14.   
  15. public:   
  16.     int m_nData;  
  17.     int m_nMin;   
  18. };  
  19.   
  20. class CStack  
  21. {  
  22. public:  
  23.     CStack(int maxSize);//普通构造函数,构造一个大小为maxSize的栈  
  24.     CStack(const CStack &stack);//拷贝构造函数  
  25.     CStack & operator=(const CStack &stack);//赋值函数  
  26.     ~CStack(void);  
  27.     
  28.     void Push(int nPushElement);//向栈中压入一个元素nElement  
  29.     void Pop();//从栈中弹出一个元素,并返回  
  30.     int Min();//O(1)的时间返回最小元素值  
  31.   
  32. private:      
  33.     CStackElement *m_pStackArr;  
  34.     int m_top;//指向栈顶元素的下一个位置  
  35.     int m_nMaxSize;  
  36. };  

CStack.cpp:

[cpp]  view plain copy
  1. #include "StdAfx.h"  
  2. #include "CStack.h"  
  3. #include <iostream>  
  4. using namespace std;  
  5.   
  6. //普通构造函数,构造一个大小为maxSize的栈  
  7. CStack::CStack(int maxSize)  
  8. {  
  9.     m_top = 0;//指向栈顶元素的下一个位置  
  10.     m_nMaxSize = maxSize;     
  11.     m_pStackArr = new CStackElement[m_nMaxSize];      
  12. }  
  13.   
  14. //拷贝构造函数  
  15. CStack::CStack(const CStack &stack)  
  16. {  
  17.     m_top = stack.m_top;  
  18.     m_nMaxSize = stack.m_nMaxSize;  
  19.     m_pStackArr = new CStackElement[m_nMaxSize];  
  20.     memcpy(m_pStackArr, stack.m_pStackArr, m_nMaxSize);  
  21. }  
  22.   
  23. //赋值函数  
  24. CStack & CStack::operator=(const CStack &stack)  
  25. {  
  26.     if (this == &stack)//自赋值检查  
  27.     {  
  28.         return *this;  
  29.     }  
  30.   
  31.     if (stack.m_top != 0)//stack为空  
  32.     {  
  33.         if (m_nMaxSize < stack.m_nMaxSize)  
  34.         {  
  35.             m_nMaxSize = stack.m_nMaxSize;  
  36.             delete [] m_pStackArr;            
  37.             m_pStackArr = new CStackElement[m_nMaxSize];  
  38.             memcpy(m_pStackArr, stack.m_pStackArr, m_nMaxSize);  
  39.         }  
  40.     }  
  41.     return *this;  
  42. }  
  43.   
  44. //向栈中压入一个元素nElement  
  45. void CStack::Push(int nPushElement)  
  46. {  
  47.      if (m_top == m_nMaxSize)  
  48.      {        
  49.          cout << "栈满!" << endl;  
  50.      }  
  51.      else if (m_top == 0)//栈空  
  52.      {  
  53.          m_pStackArr[m_top++].m_nData = nPushElement;   
  54.          m_pStackArr[m_top++].m_nMin = nPushElement;           
  55.          cout << "压入" << nPushElement<< endl;  
  56.      }  
  57.      else  
  58.      {  
  59.          if (m_pStackArr[m_top-1].m_nMin > nPushElement)  
  60.          {  
  61.              m_pStackArr[m_top].m_nMin = nPushElement;  
  62.          }  
  63.          else  
  64.          {  
  65.              m_pStackArr[m_top].m_nMin = m_pStackArr[m_top-1].m_nMin;  
  66.          }         
  67.   
  68.          m_pStackArr[m_top++].m_nData= nPushElement;           
  69.          cout << "压入" << nPushElement<< endl;  
  70.      }  
  71. }  
  72.   
  73. //从栈中弹出一个元素,并返回  
  74. void CStack::Pop()  
  75. {  
  76.     int nPopElement = 0;  
  77.     if (m_top == 0)  
  78.     {  
  79.         nPopElement = -1;  
  80.         cout << "栈空!" << endl;  
  81.     }  
  82.     else  
  83.     {  
  84.         nPopElement = m_pStackArr[--m_top].m_nData;  
  85.         cout << "弹出" << nPopElement << endl;  
  86.     }  
  87. }  
  88.   
  89. //O(1)的时间返回最小元素值  
  90. int CStack::Min()  
  91. {    
  92.     if (m_top == 0)  
  93.     {  
  94.         cout << "栈空!" << endl;  
  95.         return -1;  
  96.     }  
  97.     else  
  98.     {  
  99.         return m_pStackArr[m_top-1].m_nMin;  
  100.     }    
  101. }  
  102.   
  103. CStack::~CStack(void)  
  104. {  
  105.       
  106. }  
测试代码:

[cpp]  view plain copy
  1. // 栈和队列的灵活应用一:包含min,max函数的栈.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3. #include "stdafx.h"  
  4. #include <iostream>  
  5. #include "CStack.h"  
  6. using namespace std;  
  7.   
  8. int _tmain(int argc, _TCHAR* argv[])  
  9. {  
  10.     CStack stack(20);     
  11.     stack.Push(4);  
  12.     cout << "Min: " << stack.Min() << endl;  
  13.       
  14.     stack.Push(5);  
  15.     cout << "Min: " << stack.Min() << endl;     
  16.   
  17.     stack.Push(2);  
  18.     cout << "Min: " << stack.Min() << endl;     
  19.   
  20.     stack.Pop();      
  21.     cout << "Min: " << stack.Min() << endl;  
  22.   
  23.     stack.Push(3);  
  24.     cout << "Min: " << stack.Min() << endl;  
  25.       
  26.     system("pause");  
  27.     return 0;  
  28. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值