• 数据结构躬行记2_链式栈及其基本操作(c++实现)


    链式栈

    优点

    链栈的建立是基于链表而不是数组。基于链表的栈相对于基于数组的栈提供了两个优点:

    1. 不需要指定栈的起始大小。链栈只需要从一个空的链表开始,然后每次压入一个值时即扩展一个结点;
    2. 要系统具有足够的可用内存,链栈将永远不会满。

    指针注意事项

    链式栈的结构体定义如下:

    1 typedef struct NODE
    2 {
    3     int data;
    4     struct NODE *link;
    5 }node, *pnode;

    其中数据类型是node,pnode是指针类型即:指向node变量地址的针,也是存储node变量的地址的空间。

    操作数据的时候要将指针解引用  *p(看进栈代码) 或者使用 ->(看出栈代码)来操作数据。

    代码实现

    #include <iostream>
    using namespace std;
    typedef struct NODE
    {
        int data;
        struct NODE *link;
    }node, *pnode;
    pnode creatStack()//创建一个空栈
    {
        pnode top = new node;
        if(top == NULL)
        {
            cout << "栈建立失败" << endl;
            return 0;
        }
        else
        {
            top->link = NULL;
        }
        return top;
    }
    int isEmpty(pnode top)//判断是否为空栈
    {
        if(top->link == NULL)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    
    //进栈操作
    void push(pnode top){
      cout << "****************进栈操作**************" << endl;
      int data,n,i=1;
      cout<<"请输入入栈的结点个数:";
      cin>>n;
      while(n--)
      {
          pnode pnew =new node;
          int m;
          if(pnew == NULL)
          {
              cout<<"入栈失败!"<<endl;
              return ;
          }
          cout<<"请输入第"<<i<<"个入栈数据:";
          cin>>m;
          (*pnew).data = m;
          (*pnew).link = (*top).link;
          (*top).link = pnew;
          i++;
    
      }
      cout<<"入栈成功!"<<endl;
    }
    
    void pop(pnode top)
    {
        cout << "****************出栈操作**************" << endl;
        if(top->link==NULL){
        cout<<"此栈为空!"<<endl;
        return ;
        }
        int n;
        cout<<"请输入出栈的结点个数:";
        cin>>n;
        while(n--)
        {
            pnode tmp = top->link;
            top->link = tmp->link;
            free(tmp);
        }
        cout<<"出栈成功!"<<endl;
    }
    void showStack(pnode top)//展示栈的所以结点内容
    {
        cout << "****************遍历操作**************" << endl;
        int i = 1;
        pnode pt = top->link;
        if(!isEmpty(top))
        {
            cout << "栈为空" << endl;
            return;
        }
        else
        {
            while(pt != NULL)
            {
                cout << "" << i << "个栈数据为:" ;
                cout << pt->data << endl;
                pt = pt->link;
                i++;
            }
        }
    }
    void destoryStack(pnode top)//清空销毁栈
    {
        cout << "****************销毁操作**************" << endl;
        if(!isEmpty(top))
        {
            cout << "栈已经为空" << endl;
            return;
        }
        else
        {
            pnode temp;
            while(top->link != NULL)
            {
                temp = top->link;
                top->link = temp->link;
                free(temp);
            }
            cout << "销毁成功" << endl;
        }
    }
    int main()
    {
        pnode top;
        top = creatStack();
        push(top);
        showStack(top);
        pop(top);
        showStack(top);
        //destoryStack(top);
        return 0;
    }
  • 相关阅读:
    无限极分类,递归分类
    foreach加循环体与不加循环体的区别
    图片base64上传时可能遇到的问题
    php(curl请求)测试接口案例
    PHP取得json前面有乱码(去除文件头部BOM)
    PHP计算连续签到天数以及累计签到天数
    原生端与服务器通过sessionid实现session共享以及登录验证
    php安装xunserch
    ROS学习(二)运行keyboard
    ROS学习(一)Ros 中使用kinect
  • 原文地址:https://www.cnblogs.com/g414056667/p/13658677.html
Copyright © 2020-2023  润新知