堆栈链式实现入栈出栈等操作(C)

来源:互联网 发布:链家端口费多少 编辑:程序博客网 时间:2024/05/19 07:07
//堆栈的链式
#include<stdio.h>
#include<malloc.h>
typedef int DataType;
typedef struct Sstack
  {       DataType  data;
       struct Sstack *next;
  }Lstack;
 
//初始化
 void StackInit(Lstack **s)    
 {                    
      *s=(Lstack*)malloc(sizeof(Lstack));  //他就是传进来的那个指针变量,来存放申请的地址
      (*s)->next=NULL;    //申请了一个头结点,也就是申请的那个地址
 }

//判断是否为空
 int StackNe(Lstack *s,DataType x)
  {
       //判断堆栈是否为空
      if(s->next==NULL)
      {
         printf("这个栈为空!");
         return 0;
      }
      else
      {
          printf("这个栈不为空");
      }
 }
 
 //入栈
 int StackInsert(Lstack *s, DataType x)
 {   
     // 在添加元素的时候要动态的申请节点添加到头结点之后
      Lstack *p;
      
      p=(Lstack*)malloc(sizeof(Lstack));
      p->data=x;
      p->next=s->next; //这两个就说明了头指针是在栈顶,而且每次添加的节点都在
      s->next=p;        //头指针之后再前一个节点之前,也就是最后插入的在栈顶。
      return 1;

 }

 //出栈
 int  StackOut(Lstack *s,DataType *x)
 {
     Lstack *p;
    p=s->next;
    if(p==NULL)
    {
      printf("栈为空");
      return 0;
    }
    else
    {
        s->next=p->next;
        *x=p->data;
        free(p);
        return 1;
    }
 }
 
 //取出栈顶元素
 int  StackTop(Lstack *s,DataType *x)
 {
     Lstack *p;
     p= s->next;
     if(p==NULL)
     {
       printf("堆栈为空");
       return 0;
     }
     else
     {
         *x=p->data;
         return 1;
     }
 }

 //释放申请空间

  void StackDestroy(Lstack *s)
  {
    Lstack *p,*q;
    p=s;
    while(p!=NULL)
    {
       q=p;
       p=p->next;
       free(q) ;
    }
  }

  //主函数
  int  main()
  {
      int i, x;
      Lstack *mystack;
      //初始化
      StackInit(&mystack);
        //入栈
      for(i=0;i<10;i++)
      StackInsert(mystack,i+1) ;
      //出栈
       for (i=0;i<10;i++)
       {
         StackOut(mystack,&x);
         printf("%d \t",x);
       }
      return 0;
  }

原创粉丝点击