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

数据结构老师布置了链栈的基本操作,让我们尽量尝试用class实现,然后我在网上参考了一部分,自己写了一个,有不足之处恳请大家指出


/*

 *  文件名:链栈.c
 *    链栈的实现
 *    版本:2.0
 *    时间:2016.11.4
 *    作者:WangYan
 *    假定条件: 假设元素的基本类型为int,且每个元素只有一个整数信息需要压栈
 *
*/

#include
#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<<"栈为空"<         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<data<         p = p->next;
    }
    return OK;
}

int main()
{
    LinkStack ls;      //定义对象 ls
    int x;              //选择数,兼输入链栈的元素值

    cout<<"******************************* "<     cout<<"请选择要进行的操作: "<     cout<<"初始化  "<     cout<<"1: 压栈  "<     cout<<"2:出栈  "<     cout<<"3:判断链栈是否为空  "<     cout<<"4:清空链栈  "<     cout<<"5:显示链栈长度  "<     cout<<"6:打印链栈  "<     cout<<"销毁链栈"<     cout<<"******************************* "<     cout<<"请输入要进行的操作:"<
    while(cin>>x)
    {
        switch (x)
        {
            case 1:
                cout<<"输入压栈数据:(末尾输入0结束)"<                 cin>>x;
                while(x)
                {
                    ls.Push(x);
                    cin>>x;
                }

                cout<                 break;
            case 2:
                if(ls.isEmpty())
                    cout<<"链栈为空栈"<                 while(ls.top)
                {
                   ls.Pop();
                }
                cout<                 break;
            case 3:
                if(ls.isEmpty())
                    cout<<"链栈为空栈"<                 else
                    cout<<"链栈不为空"<
                cout<                 break;
            case 4:
                ls.Clear();
                cout<                 break;
            case 5:
               cout<                 cout<                 break;
            case 6:
                if(ls.isEmpty())
                    cout<<"链栈为空栈"<                 else
                    ls.print();
                cout<                 break;
            default: break;
        }

    }


    return 0;
}

你可能感兴趣的:(c++,数据结构)