永发信息网

C++题目 模拟STL stack类设计实现你的stack类,该类需具有入栈,出栈,判栈空,取栈顶元素等功能;

答案:1  悬赏:40  手机版
解决时间 2021-02-15 06:24
C++题目 模拟STL stack类设计实现你的stack类,该类需具有入栈,出栈,判栈空,取栈顶元素等功能;
最佳答案
struct CAtlPlex
{
CAtlPlex* pNext;
DWORD dwRef;
void* data() { return this+1; }
static CAtlPlex* Create(CAtlPlex*& head, size_t nMax, size_t cbElement);
void FreeDataChain();
};
inline CAtlPlex* CAtlPlex::Create( CAtlPlex*& pHead, size_t nMax, size_t nElementSize )
{
CAtlPlex* pPlex;
ATLASSERT( nMax > 0 );
ATLASSERT( nElementSize > 0 );
pPlex = static_cast< CAtlPlex* >(malloc(nMax*nElementSize+sizeof(CAtlPlex)));
if( pPlex == NULL )
{
return( NULL );
}
pPlex->pNext = pHead;
pHead = pPlex;
pHead->dwRef=0;
return( pPlex );
}
inline void CAtlPlex::FreeDataChain()
{
CAtlPlex* pPlex;
pPlex = this;
while( pPlex != NULL )
{
CAtlPlex* pNext;
pNext = pPlex->pNext;
free( pPlex );
pPlex = pNext;
}
}
template
struct CLinkedStack
{
public:
struct CNode
{
public:
TYPE m_data;
CNode(CONST TYPE& element):m_data(element){}
~CNode() throw(){}
protected:
CNode(const CNode&)throw();
CNode* m_pNext;
friend struct CLinkedStack;
};
CLinkedStack(LONG nBlockSize=128):m_nBlockSize(nBlockSize),
m_pHead(NULL),m_nElements(0),m_pBlocks(NULL),m_pFree(NULL)
{
ATLASSERT(nBlockSize>0);
}
~CLinkedStack()
{
RemoveAll();
ATLASSUME(m_nElements==0);
}
HRESULT Push(CONST TYPE& in);
HRESULT Pop();
TYPE Top();
LONG Count();
BOOL IsEmpty();
VOID RemoveAll();
protected:
HRESULT GetFreeNode();
CNode* NewNode(CONST TYPE& element,CNode* pNext);
VOID FreeNode(CNode* pNode);
CNode* m_pHead;
LONG m_nElements;
CAtlPlex* m_pBlocks;
CNode* m_pFree;
LONG m_nBlockSize;

};
template
HRESULT CLinkedStack::Push(CONST TYPE& in)
{
HRESULT hr=E_FAIL;
CNode* pNode=NewNode(in,m_pHead);
if(pNode==NULL)
{
hr=E_OUTOFMEMORY;
goto END;
}
m_pHead=pNode;
hr=S_OK;
END:
return hr;
}
template
HRESULT CLinkedStack::Pop()
{
HRESULT hr=E_FAIL;
CNode* pNode=m_pHead;
if(m_pHead==NULL||m_nElements==0)
{
ATLASSERT(m_pHead==NULL&&m_nElements==0);
hr=E_FAIL;
goto END;
}
m_pHead=m_pHead->m_pNext;
FreeNode(pNode);
hr=S_OK;
END:
return hr;
}
template
TYPE CLinkedStack::Top()
{
return m_pHead->m_data;
}
template
LONG CLinkedStack::Count()
{
return m_nElements;
}
template
BOOL CLinkedStack::IsEmpty()
{
return m_nElements==0;
}
template
HRESULT CLinkedStack::GetFreeNode()
{
HRESULT hr=S_OK;
if(m_pFree==NULL)
{
CAtlPlex* pPlex;
CNode* pNode;
pPlex=CAtlPlex::Create(m_pBlocks,m_nBlockSize,sizeof(CNode));
if(pPlex==NULL)
{
hr=E_OUTOFMEMORY;
goto END;
}
pNode = (CNode*)pPlex->data();
pNode += m_nBlockSize-1;
for( int iBlock = m_nBlockSize-1; iBlock >= 0; iBlock-- )
{
pNode->m_pNext = m_pFree;
m_pFree = pNode;
pNode--;
}
}
hr=S_OK;
ATLASSUME(m_pFree!=NULL);
END:
return hr;
}
#pragma push_macro("new")
#undef new
template
typename CLinkedStack::CNode* CLinkedStack::NewNode(CONST TYPE& element,CNode* pNext)
{
CNode* pNewNode=NULL;
if(GetFreeNode()!=S_OK)
{
goto END;
}
pNewNode=m_pFree;
m_pFree=m_pFree->m_pNext;
::new(pNewNode) CNode(element);
pNewNode->m_pNext=pNext;
m_nElements++;
ATLASSERT(m_nElements>0);
END:
return pNewNode;
}
#pragma pop_macro("new")
template
VOID CLinkedStack::FreeNode(CNode* pNode)
{
pNode->~CNode();
pNode->m_pNext=m_pFree;
m_pFree=pNode;
ATLASSERT(m_nElements>0);
m_nElements--;
if(m_nElements==0)
{
RemoveAll();
}
}
template
VOID CLinkedStack::RemoveAll()
{
CNode* pNode;
for (pNode = m_pHead; pNode != NULL; pNode = pNode->m_pNext)
pNode->~CNode();
m_nElements = 0;
m_pHead = NULL;
m_pBlocks->FreeDataChain();
m_pBlocks = NULL;
m_pFree = NULL;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
昨天太平洋车险售后理赔给我打电话让我去面试
为什么我家的星际争霸2到51%时就出现下面这种
婆媳的战国时代李丽娜和赵子泉离婚了吗
柳州市柳北区档案馆我想知道这个在什么地方
银行卡密码输入三次错误冻住后,还可以往里面
【基数词和序数词】1-30的基数词和序数词只限
电脑玩游戏突然死机了,然后在开机就无反应了
定远舰一共参加了几次海战
游泳池水深1.8米,水面到天花板的距离为6米,
k1317次列车补票在几号车厢
从个位起,向左数,第几位是千位,第几位是十
口袋妖怪魂银快龙多少级学龙舞?
如意工业电器供应站在哪里啊,我有事要去这个
那个交通银行离三桥车辆厂近
喜爱吃甜食怎么用英语说
推荐资讯
间接和直接沟通方式的区别
读下图写出关节的结构名称:②, ③ ,④ 
工程项目过程控制中,一般将项目过程分为( 
逻辑狗家庭版与正式版有什么不同
请问水蜡洗车与普通蜡洗车的区别?
我的美丽生活馆怎么去啊,我要去那办事
紫尼子褂配什么颜色的线衣
怎么辨别越野摩托车发动机真伪
部落的大师级制皮到哪学?
万胜压缩机质量怎么样?全球排第几?
吸油烟机的安装高度是多少
银行买入外国纸币时所使用的外汇牌价是()。[
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?