#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#pragma once
void Error(string error)
{
cout<<error<<endl;
system("pause");
exit(1);
}
//链式栈
//测试时间2010-3-4
#pragma once
#ifndef LINKNODE_H
#define LINKNODE_H
template<class T>
class LinkNode
{
public:
T data; //数据域
LinkNode<T> *next; //链指针
LinkNode(LinkNode<T> *p=NULL){next=p;} //仅初始化指针成员的构造函数
LinkNode(T item,LinkNode<T> *p=NULL) //初始化数据与指针成员的构造函数
{ data=item;next=p;}
};
#endif
#ifndef LINKSTACK_H
#define LINKSTACK_H
template<class T>
class LinkStack
{
private:
LinkNode<T>* top;
int size;
public:
LinkStack(){top=NULL;size=0;} //构造函数
~LinkStack(){ClearStack();} //析构函数
void ClearStack(); //清空堆栈
int Size(){return size;} //返回堆栈长度
void Push(T data); //进栈
T Pop(); //出栈
LinkNode<T>* GetTop(); //取得栈顶元素指针
bool IsEmpty(); //判断堆栈是否为空
LinkStack<T>& operator=(LinkStack<T>& stack); //运算符重载
};
#endif
template<class T>
void LinkStack<T>::ClearStack()
{
LinkNode<T> *node;
while(top!=NULL)
{
node=top;
top=top->next;
delete node;
}
size=0;
}
template<class T>
void LinkStack<T>::Push(T data)
{
top=new LinkNode<T>(data,top);
size++;
if(top==NULL)
Error("进栈失败!");
}
template<class T>
T LinkStack<T>::Pop()
{
if(size==0)
Error("出栈失败!");
LinkNode<T>* node=top;
top=top->next;
T data=node->data;
delete node;
node=NULL;
size--;
return data;
}
template<class T>
LinkNode<T>* LinkStack<T>::GetTop()
{
if(size==0)
Error("读取数据出错!");
return top;
}
template<class T>
bool LinkStack<T>::IsEmpty()
{ return (size==0)?true:false;}
template<class T>
LinkStack<T>& LinkStack<T>::operator =(LinkStack<T> &stack)
{
LinkNode<T> *node=stack.GetTop();
LinkStack<T> s;
while(node!=NULL)
{
s.Push(node->data);
node=node->next;
}
while(s.Size()>0)
{
Push(s.Pop());
}
return *this;
}
数据结构学习----链式栈
最新推荐文章于 2024-08-06 21:51:46 发布