数据结构老师布置了链栈的基本操作,让我们尽量尝试用class实现,然后我在网上参考了一部分,自己写了一个,有不足之处恳请大家指出
/*
* 文件名:链栈.c* 链栈的实现
* 版本:2.0
* 时间:2016.11.4
* 作者:WangYan
* 假定条件: 假设元素的基本类型为int,且每个元素只有一个整数信息需要压栈
*
*/
#include<iostream>
#define OK 1
#define ERROR -1
using namespace std;
typedef int Elemtype;
typedef struct Stacknode
{
Elemtype data;
struct Stacknode *next;
}snode;
class LinkStack
{
public:
LinkStack();
int Push(Elemtype data); //进栈
int Pop(); //出栈 Elemtype &data
int Clear(); //清空链栈
bool isEmpty(); //判空
int print() const; //打印链栈内元素
~LinkStack(); //析构,销毁
static int Count; //存放栈的大小
snode *top; //栈顶指针
//protected:
};
/**初始化栈的长度*/
int LinkStack::Count = 0;
/***********************
初始化链栈
调用构造函数
***********************/
LinkStack::LinkStack()
{
top = NULL; //top = NULL表示链栈为空
}
/***********************
销毁链栈
析构函数
***********************/
LinkStack::~LinkStack()
{
snode *p = NULL;
while(top) //循环释放节点
{
p = top->next;
delete top;
top = p;
}
}
/***********************
进栈操作
Push
data为进栈的数据
***********************/
int LinkStack::Push(Elemtype data)
{
snode *snew = new snode; //创建新节点
snew->data = data; //新节点赋值
snew->next = top; //新栈顶指向旧栈顶
top = snew; //top指向新栈顶
Count ++;
return OK;
}
/***********************
出栈操作
Pop
***********************/
int LinkStack::Pop()
{
if(!top)
return ERROR;
if(isEmpty() == 1)
{
cout<<"栈为空"<<endl;
return OK;
}
snode *p = top->next; //预存下一节点的指针
//data = top->data; //将栈顶元素返回给主函数使用
delete top; //释放栈顶空间
top = p; //栈顶下移
Count --;
return OK;
}
/***************
判断链栈是否为空
IsEmpty
****************/
bool LinkStack::isEmpty()
{
return (top == NULL); //栈顶为空则返回1 ,不为空返回0
}
/***********************
清空链栈
Clear
形式同析构函数
***********************/
int LinkStack::Clear()
{
snode *p;
while(top) //循环释放节点
{
p = top;
top = top->next;
delete p;
}
return OK;
}
/***********************
打印链栈中元素
通过遍历链栈打印元素值
***********************/
int LinkStack::print() const
{
snode *p = top;
while(p && Count) //栈不为空 && 栈中存在数据
{
cout<<p->data<<ends<<ends; //遍历打印栈中数据
p = p->next;
}
return OK;
}
int main()
{
LinkStack ls; //定义对象 ls
int x; //选择数,兼输入链栈的元素值
cout<<"******************************* "<<endl;
cout<<"请选择要进行的操作: "<<endl;
cout<<"初始化 "<<endl;
cout<<"1: 压栈 "<<endl;
cout<<"2:出栈 "<<endl;
cout<<"3:判断链栈是否为空 "<<endl;
cout<<"4:清空链栈 "<<endl;
cout<<"5:显示链栈长度 "<<endl;
cout<<"6:打印链栈 "<<endl;
cout<<"销毁链栈"<<endl;
cout<<"******************************* "<<endl;
cout<<"请输入要进行的操作:"<<endl;
while(cin>>x)
{
switch (x)
{
case 1:
cout<<"输入压栈数据:(末尾输入0结束)"<<endl;
cin>>x;
while(x)
{
ls.Push(x);
cin>>x;
}
cout<<endl<<"请输入下一步操作:";
break;
case 2:
if(ls.isEmpty())
cout<<"链栈为空栈"<<endl;
while(ls.top)
{
ls.Pop();
}
cout<<endl<<"请输入下一步操作:";
break;
case 3:
if(ls.isEmpty())
cout<<"链栈为空栈"<<endl;
else
cout<<"链栈不为空"<<endl;
cout<<endl<<"请输入下一步操作:";
break;
case 4:
ls.Clear();
cout<<endl<<"请输入下一步操作:";
break;
case 5:
cout<<ls.Count<<endl;
cout<<endl<<"请输入下一步操作:";
break;
case 6:
if(ls.isEmpty())
cout<<"链栈为空栈"<<endl;
else
ls.print();
cout<<endl<<"请输入下一步操作:";
break;
default: break;
}
}
return 0;
}