#include
#include
#include
#include
#include
#include
class linkstack;//类linkstack的申明
class linkstacknode
{
friend class linkstack;//申请友元类
private:
linkstacknode(linkstacknode *nextp=NULL);//构造函数
linkstacknode(int &newdata , linkstacknode *nextp=NULL);//构造函数
int data;//数据元素
linkstacknode *next;//递归定义指向后继结点的指针
};
class linkstack
{
public:
linkstack(); //创建一个空栈。
~linkstack(); //销毁一个栈
void destroy();//销毁一个栈。
bool isempty() const;//确定栈是否已空。
int getlength() const;//获取栈中元素的个数
bool push(int &item);//把数据压进栈。
bool pop();//把数据弹出栈。
bool pop(int &item);
bool gettop(int &item) const; //取出栈顶数据。
void display(); //显示栈的所有元素。
private:
linkstacknode *newnode(linkstacknode *nextp=NULL);
linkstacknode *newnode(int &item ,linkstacknode *nextp=NULL);//创建新的结点。
linkstacknode *linkstacktop;
int linkstacklength;
};
linkstacknode::linkstacknode(linkstacknode *nextp)
{
next=nextp;
}
linkstacknode::linkstacknode(int &newdata,linkstacknode *nextp)
{
data=newdata;
next=nextp;
}
//结点类linkstacknode的定义结束
linkstacknode *linkstack::newnode(linkstacknode *nextp)//创建新的结点,不带数据。
{
return new linkstacknode(nextp);
}
linkstacknode *linkstack::newnode(int &item ,linkstacknode *nextp)//创建新的结点,数据域赋值。
{
return new linkstacknode(item,nextp);
}
//以下为栈类linkstack的函数定义
linkstack::linkstack()//创建一个空栈。
{
linkstacktop=newnode();//创建一个栈顶指针初始化,相当于linkstacktop=NULL;本链表没有用头结点
linkstacklength=0;
}
linkstack::~linkstack()//销毁一个栈
{
destroy();
delete linkstacktop;//释放栈底
}
void linkstack::destroy()//销毁一个栈。
{
while(pop());//不停的出栈,而每次释放空间在出栈函数中完成
}
bool linkstack::isempty() const//确定栈是否已空。
{
return linkstacklength>0 ? false : true;
}
int linkstack::getlength() const//返回栈的长度。
{
return linkstacklength;
}
bool linkstack::push(int &item)//数据进栈。
{
linkstacknode *newnodep;//定义指针newnodep准备指向申请的新结点
newnodep=newnode(item,linkstacktop);//申请新结点,把数据存入,把指针域指向头指针①
if(!newnodep)
return false; //如果没有申请到空间,返回失败
linkstacktop=newnodep;//改链,完成进栈②
linkstacklength++; //栈的长度增加
return true; //本次操作成功
}
bool linkstack::pop()//出栈,栈顶数据不要了。
{
linkstacknode *usednodep; //定义指针usednodep准备指向出栈的结点
if(!isempty()) //判断是否栈空
{
usednodep=linkstacktop; //指向出栈的结点
linkstacktop=linkstacktop->next;//栈顶指针后移
delete usednodep; //释放空间
linkstacklength--; //栈的长度减少
return true; //本次操作成功
}
return false; //否则本次操作失败
}
bool linkstack::pop(int &item)//出栈,把栈顶数据返回去。
{
linkstacknode *usednodep; //定义指针usednodep准备指向出栈的结点
if(!isempty()) //判断是否栈空
{
usednodep=linkstacktop; //指向出栈的结点①
linkstacktop=linkstacktop->next;//栈顶指针后移②
item=usednodep->data; //把数据保留下来,返回去
delete usednodep; //释放空间③
linkstacklength--; //栈的长度减少
return true; //本次操作成功
}
return false; //否则本次操作失败
}
bool linkstack::gettop(int &item) const//取出栈顶数据返回去。
{
if(!isempty())
{
item=linkstacktop->data;
return true;
}
return false;
}
void linkstack::display()//显示栈的所有元素。
{
linkstacknode *searchp;//定义搜索指针
searchp=linkstacktop;//搜索指针初始化
cout<<"栈中的内容是:栈顶→";
while(searchp->next)
{
cout<<' '<<searchp->data;
searchp=searchp->next;
}
cout<<"■栈底"<<endl;
}
//======主函数===========
void main()
{
linkstack stack;
bool flag=true;
int userchoice=7;
char yesno;
int number;
while(1)
{
if(userchoice==7)
{
system("cls");
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<<"** 7: ***清屏*** **"<<endl;
cout<<"** 0: 退出 **"<<endl;
cout<<"***************************************"<<endl;
}
cout<<"请选择:";
cin>>userchoice;
if(userchoice==0)
//退出程序
break;
switch(userchoice)
{
case 1://把数据压入栈
cout<<"输入准备进栈的数据:";
cin>>number;
if(stack.push(number))
{
cout<<"数据 "<<number<<" 成功地进入栈!"<<endl;
stack.display();
}
else
cout<<"数据 "<<number<<" 进栈失败!"<<endl;
break;
case 2://从栈中弹出数据
if(stack.pop(number))
cout<<"从栈中成功地弹出数据:"<<number<<endl;
else
cout<<"弹出操作失败"<<endl;
stack.display();
break;
case 3:
stack.display();
break;
case 4:
if(stack.gettop(number))
{ cout<<"栈顶数据为:"<<number<<endl;
stack.display();
}
else
cout<<"取栈顶数据操作失败"<<endl;
break;
case 5://销毁一个栈
cout<<"你真得要销毁栈?请输入(Y/y)确定:";
cin>>yesno;
if(yesno=='Y'||yesno=='y')
{
stack.destroy();
cout<<"栈已经销毁!"<<endl;
}
break;
case 6://判断栈是否已空
if(stack.isempty())
cout<<"栈是空的。"<<endl;
else
cout<<"栈中还有数据。"<<endl;
break;
case 7:
break;
default:
cout<<"对不起,输入命令有错!"<<endl;
break;
}
}
}//======主函数结束===========