栈在实际编程中经常会用到,本文利用数组和链表分别实现了栈的操作。
1.数组方式实现如下:
#include<iostream> using namespace std; template <class T> class arraystack{ public: arraystack(); ~arraystack(); bool isempty(); void push(const T& data); void pop(); T& gettop(); private: T *stacknodes; int top; int capacity; }; template<class T> arraystack<T>::arraystack() { capacity=3; stacknodes=new T[3]; top=-1; cout<<"the stack is constructed!"<<endl; cout<<"the capacity is:"<<capacity<<endl; } template <class T> arraystack<T>::~arraystack() { delete []stacknodes; capacity=0; top=-1; cout<<"the stack is destructed!"<<endl; } template <class T> bool arraystack<T>::isempty() { if(top==-1) return true; else return false; } template <class T> void arraystack<T>::push(const T& data) { if(top+1==capacity) { capacity=2*capacity; T *p=new T[capacity]; for(int i=0;i<=top;++i) p[i]=stacknodes[i]; T *q=stacknodes; stacknodes=p; delete []q; cout<<"the capacity is:"<<capacity<<endl; } stacknodes[++top]=data; cout<<"push in:"<<stacknodes[top]<<endl; } template <class T> void arraystack<T>::pop() { if(!isempty()) top--; } template <class T> T& arraystack<T>::gettop() { if(!isempty()) return stacknodes[top]; } int main() { const int n=5; int data; arraystack<int> stk; int a[n]={4,8,6,12,9}; for(int i=0;i<n;i++) stk.push(a[i]); while(!stk.isempty()) { data=stk.gettop(); cout<<"pop out:"<<data<<endl; stk.pop(); } }
2.链表方式实现如下:
#include<iostream> using namespace std; template <class T> struct linknode{ T data; linknode* next; }; template <class T> class mystack{ public: mystack(); ~mystack(); bool isempty(); void push(const T& data); void pop(); T& gettop(); private: linknode<T> *head; linknode<T> *top; int length; }; template <class T> mystack<T>::mystack() { head=NULL; top=NULL; length=0; cout<<"the stack is constructed!"<<endl; } template <class T> mystack<T>::~mystack() { while(!isempty()) pop(); cout<<"the stack is destructed!"<<endl; } template <class T> bool mystack<T>::isempty() { if(head==NULL) return true; else return false; } template <class T> void mystack<T>::push(const T& data) { if(!head) { head=new linknode<T>; head->data=data; head->next=NULL; top=head; length++; cout<<"push in:"<<top->data<<endl; } else { linknode<T> *p=new linknode<T>; p->data=data; p->next=NULL; top->next=p; top=p; length++; cout<<"push in:"<<top->data<<endl; } } template <class T> void mystack<T>::pop() { if(!isempty()) { linknode<T> *p=head; if(p==top) { head=NULL; top=NULL; } else { while(p->next!=top) { p=p->next; } top=p; p=top->next; } delete p; length--; } } template <class T> T& mystack<T>::gettop() { if(!isempty()) return top->data; } int main() { const int n=5; int data; mystack<int> stk; int a[n]={4,8,6,12,9}; for(int i=0;i<n;i++) stk.push(a[i]); while(!stk.isempty()) { data=stk.gettop(); cout<<"pop out:"<<data<<endl; stk.pop(); } }