数据结构--链栈基本功能实现程序代…

数据结构--链栈基本功能实现程序代码

 

#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;

                   }

         }

}//======主函数结束===========

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值