c语言数据结构-----栈的链式存储(源码奉上)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
源码:


status.h


#ifndef STATUS_H
#define STATUS_H
//函数结果状态代码
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1
 #define OVERFLOW -2
 //Status是函数的类型,其值是函数结果状态代码
  typedef int Status;
  typedef int SElemType;
 #endif

stack.h


#ifndef STACK_H
#define STACK_H
#include <stdio.h>
#include "status.h"
#define  STACK_INIT_SIZE   100        //线性表存储空间的初始分配量
#define STACKINCREMENT 10         //线性表存储空间的分配增量 
typedef  struct {
  SElemType  *elem;         //指向存放线性表中数据元素的基地址
  int  length;          //线性表的当前长度   
    int  stacksize;        //当前分配的存储容量                                           
  }SqStack;
/*
(1)初始化栈  InitStack(S)    
          (2)入栈  Push(S,item)      
          (3)出栈  Pop(S,item)       
          (4)获取栈顶元素内容  GetTop(S,item)   
          (5)判断栈是否为空 StackEmpty(S)  
          */
          Status InitStack(SqStack *s);
          Status Push(SqStack *s,SElemType e);
          Status Pop(SqStack *s,SElemType *e);
          Status GetTop(SqStack *s,SElemType *e);
          Status StackEmpty(SqStack *s);
#endif

stack.c


#include <stdio.h>
#include "stack.h"
Status InitStack(SqStack *s)//进行初始化栈 
          {
         s->elem=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
           if(s->elem==NULL)
         {
         return ERROR;
            }
            s->length=0;//说明没有元素 
            s->stacksize=STACK_INIT_SIZE;//为栈开辟内存空间 
          return OK;
          }
Status Push(SqStack *s,SElemType e)
          {
           //是否满,扩容
           if(s->length==s->stacksize)//元素个数正好占据满了开辟的内存空间 
           {
           s->elem=(SElemType *)realloc(s->elem,(s->stacksize+STACKINCREMENT)*sizeof(SElemType));
           if(s->elem==NULL)
           {
            return ERROR;
            }
           }
     s->elem[s->length]=e;
     s->length++;
     return OK;
          }
Status Pop(SqStack *s,SElemType *e)
    {
           if(s->length==0)
           return ERROR;
           *e=s->elem[s->length-1];
           s->length--;
           return TRUE;
          }
Status GetTop(SqStack *s,SElemType *e)//获取栈顶元素内容  
          {
           if(s->length==0)
           return ERROR;
           *e=s->elem[s->length-1]; 
           return TRUE; 
          }
Status StackEmpty(SqStack *s)//判断栈是否为空 
          {
           return s->length==0?TRUE:ERROR;
          }

main.c


#include "stack.h"
#include <stdio.h>
int main()
{
  SqStack sq;
  SqStack *s=&sq;
  int i,t,n,site; 
  SElemType value;


  printf("==================初始化栈==================\n"); 
  t=InitStack(s);
  if(t==ERROR)
  printf("-----栈初始化失败------");
  else
  {
   printf("栈中元素个数为:%d\n栈开辟的内存空间为:%d\n",s->length,s->stacksize); 
  } 



  printf("==================栈内存中添加元素==================\n"); 
  printf("请输入你要添加元素的个数为:");
  scanf("%d",&n);
  printf("请依次输入%d元素:",n);
  for(i=1;i<=n;i++)
  {
   scanf("%d",&value);
      Push(s,value);  
  }
  printf("此时栈中的元素为:");
  for(i=0;i<n;i++)
  printf("%d  ",s->elem[i]); 




  printf("\n==================元素进栈==================\n"); 
  printf("请输入你要进栈的数:");
     scanf("%d",&value);
     Push(s,value); 
     printf("\n此时栈中的元素为:");
  for(i=0;i<s->length;i++)
  printf("%d  ",s->elem[i]);




  printf("\n==================元素出栈==================\n");  
  Pop(s,&value);
  printf("出栈的元素为:%d\n",value); 
  printf("此时栈中的元素为:");
  for(i=0;i<s->length;i++)
  printf("%d  ",s->elem[i]);




  printf("\n==================获取栈顶元素内容==================\n");
  t=GetTop(s,&value);
  if(t==ERROR)
  printf("-----获取栈顶元素失败------");
  else
  printf("栈顶元素为:%d",value) ;




  printf("\n==================判断栈是否为空 ==================\n");
  t=StackEmpty(s);
  if(t==TRUE)
  printf("---线性表为空---\n");
  else
     printf("---线性表不为空---\n");
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值