面试题21 包含min函数的栈
2014-09-12 16:14
162 查看
CStack.h:
[cpp] view
plaincopy
#pragma once
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;
};
CStack.cpp:
[cpp] view
plaincopy
#include "StdAfx.h"
#include "CStack.h"
#include <iostream>
using namespace std;
//普通构造函数,构造一个大小为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)//stack为空
{
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;
}
//向栈中压入一个元素nElement
void 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)
{
}
测试代码:
[cpp] view
plaincopy
// 栈和队列的灵活应用一:包含min,max函数的栈.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include "CStack.h"
using namespace std;
int _tmain(int argc, _TCHAR* 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;
system("pause");
return 0;
}
相关文章推荐
- 剑指offer-面试题21:包含min函数的栈
- 剑指offer面试题[21]包含min函数的栈
- 【剑指offer】面试题21:包含min函数的栈
- 剑指Offer:面试题21 包含min函数的栈
- 【剑指offer 面试题21】包含min函数的栈
- 面试题21:包含min函数的栈
- 面试题21:包含min函数的栈
- 剑指offer——面试题21:包含min函数的栈
- 剑指Offer----面试题21:包含min函数的栈
- 海涛老师的面试题-作业21-包含min函数的栈
- 面试题21:包含min函数的栈
- 剑指Offer_面试题21_包含min函数的栈
- 面试题21:包含min函数的栈
- 剑指Offer之面试题21:包含min函数的栈
- (剑指Offer)面试题21:包含min函数的栈
- 《剑指offer》面试题21—包含min函数的栈
- 剑指offer--面试题21:包含min函数的栈
- 《剑指Offer》面试题21:包含min函数的栈
- 经典面试题21——包含min函数的栈
- 面试题21:包含min函数的栈