Stack-c++template

 

1.堆栈模板的链表C++实现,2.堆栈模板的数组C++实现 chinanetboy write by 09/13/07

 

堆栈特点:只能通过栈顶读取数据,添加和删除数据只能以push,pop

数组和链表差别:数组实现的堆栈长度是有限的,链表实现的堆栈长度是无限的

 

//=============================================================================

1.堆栈模板的链表实现包括一个头文件和一个测试程序
//=============================================================================
//  MR.yao workshop Copyright (C) 2007-2008.
//
//  module: stack.h 1.堆栈模板的链表头文件

//
//  Modify History:
//
//  MR.yao           Create:09/13/07   
//=============================================================================
#ifndef  H_Stack
#define  H_Stack

#include <iostream>
#include <cassert>
using namespace std;
//=============================================================================
//  FUNCTION: stack class template ADT
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
struct node
{
 T data;
 node<T> *link;
};

template<class T>
class stack
{
public:
 stack();
 ~stack();
 void destroy();
 bool isempty();
 bool isfull();
 void push(const T& newitem);
 void pop();
 T    top();
private:
 node<T> *stacktop;
};

//=============================================================================
//  FUNCTION: stack()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
stack<T>::stack()
{ stacktop=NULL;}//end constructor

//=============================================================================
//  FUNCTION: ~stack()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
stack<T>::~stack()
{ destroy();}//end destructor

//=============================================================================
//  FUNCTION: destroy()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
void stack<T>::destroy()

 node<T> *temp;
 while(stacktop!=NULL)
 {
  temp=stacktop;
  stacktop=stacktop->link;
  delete temp;
 }
}//end destroy

//=============================================================================
//  FUNCTION: isempty()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
bool stack<T>::isempty()
{ return (stacktop==NULL);}

//=============================================================================
//  FUNCTION: isfull()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
bool stack<T>::isfull()
{ return false;}

//=============================================================================
//  FUNCTION: push()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
void stack<T>::push(const T& newitem)
{
 node<T> *newnode;
 newnode=new node<T>;
 assert(newnode!=NULL);

 newnode->data=newitem;
 newnode->link=stacktop;
 stacktop=newnode;

}//end push

//=============================================================================
//  FUNCTION: top()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
T stack<T>::top()

 assert(stacktop!=NULL);
 return stacktop->data;
}//end top

//=============================================================================
//  FUNCTION: pop()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
void stack<T>::pop()

 node<T> *temp;
 if (stacktop!=NULL)
 {
  temp=stacktop;
  stacktop=stacktop->link;
  delete temp;
 }
 else
 cerr<<"this stack is empty.../n";
}//end pop

#endif

//demo.cpp链表堆栈测试

#include <iostream>
#include "stack.h"
using namespace std;
int main()
{
 stack<char> demo;
 demo.push('a');
 demo.push('k');
 demo.push('h');
 demo.push('w');
 cout<<"-------------------*链表堆栈测试*------------------/n";
 cout<<"1.push(a),push(k),push(h),push(w)/n";
 cout<<"2.pop(),pop(),pop(),pop()/n";
 cout<<"测试输出结果**************************************/n";
 cout<<"1:pop()= "<<demo.top()<<endl;
 demo.pop();
 cout<<"2:pop()= "<<demo.top()<<endl;
 demo.pop();
 cout<<"3:pop()= "<<demo.top()<<endl;
 demo.pop();
 cout<<"4:pop()= "<<demo.top()<<endl;
 demo.pop();
 demo.pop();
 cout<<"---------------------------------------------------/n";

 return 0;
}

2.堆栈模板的数组实现

//=============================================================================
//  MR.yao workshop Copyright (C) 2007-2008.
//
//  module: stack.h
//
//  Modify History:
//
//  MR.yao           Create:09/13/07   
//=============================================================================
#ifndef  H_Stack
#define  H_Stack

#include <iostream>
#include <cassert>
using namespace std;
//=============================================================================
//  FUNCTION: stack class template ADT
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
class stack
{
public:
 stack(int size=100);
 ~stack();
 void init();
 bool isempty();
 bool isfull();
 int  getcount();
 void push(const T& newitem);
 void pop();
 T    top();

private:
 int maxsize;
 int stacktop;
 T   *list;
 int count;
};

//=============================================================================
//  FUNCTION: stack()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
stack<T>::stack(int size)
{
 if (size<=0)
 {
  maxsize=100;
 }
 else
  maxsize=size;
 stacktop =0;
 count  =0;
 list  =new T[maxsize];
 assert(list!=NULL);
}//end constructor

//=============================================================================
//  FUNCTION: ~stack()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
stack<T>::~stack()
{
 delete [] list;
}//end destructor

//=============================================================================
//  FUNCTION: init()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
void stack<T>::init()

 stacktop=0;
 count =0;
}

//=============================================================================
//  FUNCTION: isempty()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
bool stack<T>::isempty()
{ return (stacktop==0);}

//=============================================================================
//  FUNCTION: isfull()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
bool stack<T>::isfull()
{ return (stacktop==maxsize);}

//=============================================================================
//  FUNCTION: getcount()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
int stack<T>::getcount()
{ return count;}

//=============================================================================
//  FUNCTION: push()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
void stack<T>::push(const T& newitem)
{
 if(!isfull())
 {
  list[stacktop]=newitem;
  stacktop++;
  count++;
 }
 else
 cerr<<"this stack is full...";
}//end push

//=============================================================================
//  FUNCTION: top()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
T stack<T>::top()

 assert(stacktop!=0);
 return list[stacktop -1];
}//end top

//=============================================================================
//  FUNCTION: pop()
//
//  Modify History:
//                              
//  MR.yao           Create:09/13/07   
//=============================================================================
template<class T>
void stack<T>::pop()

 if(!isempty())
 {
  stacktop--;
  count--;
 }
 else
 cerr<<"this stack is isempty...";
}//end pop

#endif

 

//demo.cpp数组堆栈测试

#include <iostream>
#include "stack.h"
using namespace std;
int main()
{
 stack<int> demo(10);
 demo.push(12);
 demo.push(33);
 demo.push(44);
 demo.push(66);
 cout<<"-------------------*数组堆栈测试*------------------/n";
 cout<<"1.push(12),push(33),push(44),push(66)/n";
 cout<<"2.pop(),pop(),pop(),pop()/n";
 cout<<"测试输出结果**************************************/n";

 while(!demo.isempty())
 { 
  cout<<demo.getcount()<<"/tpop()= "<<demo.top()<<"/n";
  demo.pop();
 }
 cout<<"---------------------------------------------------/n";
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值