链栈
链式栈是线性表的链接存储表示形式。我们采用链式栈来表示一个栈,有利于结点的插入和删除。用链接表示不但能提高效率。还可达到共享的目的。如图所示为一个链式栈。
从图中可以获知,链式栈的栈顶在链表的表头。那么新结点的插入和结点的删除都在链表的表头,也就是栈顶进行的。
下面给出链栈的实现:
#ifndef LINKSTIC_H
#define LINKSTIC_H
#include<iostream>
#include<assert.h>
using namespace std;
template<typename T> struct stacknode{
T data;
stacknode *link;
stacknode(T d=0,stacknode<T> *next=NULL):link(next),data(d){}
};
template<typename T> class linkedstack
{
public:
linkedstack():top(NULL){}
~linkedstack(){makeempty();};
void Push(const T &x);
bool Pop(T &x);
bool gettop(T &x)const;
bool Isempty()const{return (top==NULL)?true:false;}
int getsize()const;
void makeempty();
friend ostream& operator<<(ostream& os,linkedstack<T> &s){
stacknode<T> *p=s.top;int i=0;
while(p!=NULL)
{
os<<++i<<":"<<p->data<<endl;
p=p->link;
}
return os;
}
private:
stacknode<T> *top;
};
#endif
template<typename T> void linkedstack<T>::makeempty()
{
stacknode<T> *p;
while(top!=NULL)
{
p=top;
top=top->link;
delete p;
}
};
template<typename T> void linkedstack<T>::Push(const T &x)
{
top=new stacknode<T>(x,top);
assert(top!=NULL);
};
template<typename T> bool linkedstack<T>::Pop(T &x)
{
if(Isempty()==true) return false;
stacknode<T> *p=top;
top=top->link;
x=p->data;
delete p;
return true;
};
template<typename T> bool linkedstack<T>::gettop(T &x)const
{
if(Isempty()==true) return false;
x=top->data;
return true;
};
template<typename T> int linkedstack<T>::getsize()const{
stacknode<T> *p=top;int k=0;
while(top!=NULL)
{
top=top->link;
k++;
}
return k;
};
#include<iostream>
#include"LINKSTIC.h"
#include<stdlib.h>
using namespace std;
int main()
{
linkedstack<int> list;
int i,n,k=1;
cin>>n;
for(int j=0;j<n;j++)
{
cin>>i;
list.Push(i);
}
list.Pop(k);
cout<<list<<endl;
system("pause");
}