zoukankan      html  css  js  c++  java
  • 数据结构躬行记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;
    }
  • 相关阅读:
    ASP.NET中级学习3
    C#面向对象学习笔记
    Javascript学习笔记
    FormView控件使用
    ASP.NET初级学习
    ListView控件是使用
    Java NIO 学习笔记一
    堆栈和托管堆 c#
    安装php7.2并且整合nginx且分开部署
    Python 安装requests和MySQLdb
  • 原文地址:https://www.cnblogs.com/g414056667/p/13658677.html
Copyright © 2011-2022 走看看