C++模板堆栈类

堆栈比较完美的版本实现,平常可以自己开堆栈使用。目前的一个任务情况是通过逆波兰法解析数学表达式而用到堆栈。
/*
============================================================================
Name        : CStack
Author      : Swair Fang
Version     : 5.1
CopyRight   : by Swair Fang
Description : CStack Achieving, Ansi-style
Function:
	1.Push
	2.Pop
	3.Top
	4.Print
Example:
	CStack Stack;
	T X;
	Stack.Push(X);
	Stack.Pop(&X);
	Stack.Top();
	Stack.Print();
============================================================================
 */
#ifndef _CStack_H
#define _CStack_H

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
using namespace std;

template
      
      
       
       
class CStack
{
	typedef struct CNode
	{
		T m_Elt;
		struct CNode *pNext;
	};
private:
	struct CNode *m_pStack;
	int m_iSize;
	struct CNode *m_pNode;
public:
	CStack();
	~CStack();
	int GetSize();
	void operator=(CStack &Right);
	void Push(T X);
	void Pop(T &m_pPX);
	void Top(T &m_pPX);
	void MakeEmpty();
	void Print();
	void Empty();
};
template
       
       
         CStack 
        
          ::CStack() { printf("Create CStack\n"); m_pStack=new CNode; if(m_pStack==NULL) printf("Out of space!!!"); m_pStack->pNext=NULL; m_iSize=0; } template 
         
           CStack 
          
            ::~CStack() { printf("Destroy CStack\n"); CNode *Tmp; m_pNode=m_pStack->pNext; m_pStack->pNext=NULL; while(m_pNode!=NULL) { Tmp=m_pNode->pNext; delete m_pNode; m_pNode=Tmp; } delete m_pStack; } template 
           
             int CStack 
            
              ::GetSize() { return m_iSize; } template 
             
               void CStack 
              
                ::Empty() { printf("Empty CStack\n"); CNode *Tmp; m_pNode=m_pStack->pNext; m_pStack->pNext=NULL; while(m_pNode!=NULL) { Tmp=m_pNode->pNext; delete m_pNode; m_pNode=Tmp; } m_iSize=0; } template 
               
                 void CStack 
                
                  ::operator=(CStack &Right) { printf("call assignment\n"); Empty(); m_pNode=m_pStack; Right.m_pNode=Right.m_pStack->pNext; while(Right.P!=NULL) { struct CNode *Tmp=new CNode; Tmp->m_Elt=Right.P->m_Elt; Tmp->pNext=NULL; m_pNode->pNext=Tmp; m_pNode=m_pNode->pNext; Right.m_pNode=Right.m_pNode->pNext; } m_iSize=Right.m_iSize; } template 
                 
                   void CStack 
                  
                    ::Push(T X) { m_pNode=new CNode; if(m_pNode==NULL) { printf("Out of space!!!"); exit(1); } m_pNode->m_Elt=X; m_pNode->pNext=m_pStack->pNext; m_pStack->pNext=m_pNode; m_iSize++; } template 
                   
                     void CStack 
                    
                      ::Pop(T &pX) { if(m_pStack->pNext==NULL) printf("Empty CStack"); else { m_pNode=m_pStack->pNext; m_pStack->pNext=m_pStack->pNext->pNext; T X=m_pNode->m_Elt; free(m_pNode); pX=X; m_iSize--; } } template 
                     
                       void CStack 
                      
                        ::Top(T &pX) { if(m_pStack==NULL||m_pStack->pNext==NULL) printf("Empty CStack"); else { pX=m_pStack->pNext->m_Elt; } } template 
                       
                         void CStack 
                        
                          ::Print() { if(m_pStack->pNext==NULL) printf("CStack is Empty\n"); else { m_pNode=m_pStack->pNext; while(m_pNode!=NULL) { char *cp=(char*)m_pNode; printf("0x%x:",cp); cout< 
                         
                           m_Elt< 
                          
                            pNext; } printf("m_iSize:%d\n\n",m_iSize); } } #endif int main() { CStack 
                           
                             Stack; Stack.Push(3.324); Stack.Print(); CStack 
                            
                              stack; stack.Push("hello,unistar"); stack.Print(); char* c; stack.Pop(c); cout< 
                             
                               < 
                               
                              
                             
                            
                           
                          
                         
                        
                       
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值