栈基本操作(顺序栈、共享栈、单链栈说明)C语言版

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50
typedef struct
 {
     int *data;
     int pop;
 }Sqstack;
 void Init(Sqstack *S)  //初始化栈
 {
     S->pop=-1;
     printf("-------初始化成功");
 }
 int StackEmpty(Sqstack S) //判空
 {
     if(S.pop==-1)
        return 1;
     return -1;
 }
 int Length(Sqstack S)  //求栈长
 {
     return S.pop+1;
 }
 int Push(Sqstack *S,int d)  //压栈
 {
      if(S->pop>=MAXSIZE-1)  //判断栈满
        return -1;
      S->data[++S->pop]=d;
      return 1;
 }
 int Pop(Sqstack *S)  //出栈
 {
     if(S->pop==-1)
        return -1;
     return S->data[S->pop--];
 }
 int GetTop(Sqstack S)  //读取第一个数据
 {
     if(S.pop==-1)
        return -1;
     return S.data[S.pop];
 }
 //-------------------------------------------以下为共享栈
 typedef struct
 {
     int *data;
     int front,rear; //定义两个游标,分别指向栈顶前一个和栈底后一个位置
 }ShareStack;
 void Init_S(ShareStack *S)  //初始化共享栈,其实就是把一个顺序栈分为分别以顶和底为栈底的两个站
 {
     S->front=-1;
     S->rear=MAXSIZE;
     printf("\n--------共享栈初始化成功");
 }
 int Full_S(ShareStack S)  //判满
 {
     if(S.front+1==S.rear)
        return 1;
     return -1;
 }
 int Empty_S(ShareStack S)  //判空
 {
     if(S.front==-1&&S.rear==MAXSIZE)  //全空
        return -1;
     if(S.front==-1&&S.rear!=MAXSIZE)  //1号空
        return -2;
     if(S.front!=-1&&S.rear==MAXSIZE)  //2号空
        return -3;
 }
 int Length_S(ShareStack S)  //求长
 {
     return S.front+1+MAXSIZE-S.rear;
 }
 int Push_S(ShareStack *S,int d,int SN)  //压栈
 {
     if(Empty_S(*S)==1) //若栈满
        return -1;
     if(SN!=1&&SN!=2)  //栈号判误
        return -3;
     if(SN==1)
        S->data[++S->front]=d;
     else
        S->data[--S->rear]=d;
 }
int Pop_S(ShareStack *S,int SN)  //出栈
{
     if(SN!=1&&SN!=2)  //栈号判误
        return -3;
     if(SN==1)
     {
      if(Empty_S(*S)==-2) //若1号空
            return -1;
      return S->data[S->front--];
     }
     if(Empty_S(*S)==-3) //若2号空
            return -2;
      return S->data[S->rear++];
}
int Get_S(ShareStack *S,int SN) //读栈顶元素,与出栈区别为游标是否移动
{
    if(SN!=1&&SN!=2)  //栈号判误
        return -3;
     if(SN==1)
     {
      if(Empty_S(*S)==-2) //若1号空
            return -1;
      return S->data[S->front];
     }
     if(Empty_S(*S)==-3) //若2号空
            return -2;
      return S->data[S->rear];
}

int main()
{
    //----------------------以下为顺序栈
    Sqstack S1;
    S1.data=(int *)malloc(sizeof(int)*MAXSIZE);
    Init(&S1);
    printf("\n是否为空:%d",StackEmpty(S1));
    Push(&S1,2);
    printf("\n栈长:%d",Length(S1));
    printf("\n读取元素:%d",GetTop(S1));
    printf("\n弹出数据:%d",Pop(&S1));
    printf("\n栈长:%d",Length(S1));
    free(S1.data);
    //----------------------以下为共享栈
    ShareStack S2;
    S2.data=(int *)malloc(sizeof(int)*MAXSIZE);
    Init_S(&S2);
    printf("\n共享栈长:%d",Length_S(S2));
    Push_S(&S2,1,1);
    Push_S(&S2,1,2);
    printf("\n共享栈长:%d",Length_S(S2));
    Pop_S(&S2,1);
    printf("\n共享栈长:%d",Length_S(S2));
    printf("\n获取元素:%d",Get_S(&S2,2));
    printf("\n共享栈判空:%d",Empty_S(S2));
    //----------------------以下为单链栈说明
    /*单链栈操作逻辑与顺序栈一致,即压栈以头插法完成
    (实际认为栈顶节点为头结点,即栈顶为头结点,所有操作都在表头进行)
    出栈读出表头节点即头结点后继节点后将其删除,其他操作逻辑类比顺序栈*/
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值