数据结构躬行记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;
}
原文地址:https://www.cnblogs.com/g414056667/p/13658677.html