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;
}