c++实现链栈的基本操作(附带main函数 可编译运行)

数据结构老师布置了链栈的基本操作,让我们尽量尝试用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;
}

/***********************
打印链栈中元素
print
通过遍历链栈打印元素值
***********************/
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;
}

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值