栈(stack)C语言实现(有详细注释讲解)

1. 什么是栈?

     **堆栈(stack)**: 具有一定操作约束的线性表
     而用C语言实现栈,一共有三种方式:
     
     1. 用静态数组实现栈。
     2. 用动态数组实现栈。
     3. 用链表实现栈。

三种方法各有自己的优缺点,而在此篇文章中,我们用静态数组实现栈。即栈的长度已经是人为实现固定了的。

首先,我们要先导入所需的库:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

然后我们定义一个结构体用以存储栈里面的数据 data 和一个指向栈顶的标志 top:

#define MAXSIZE 128
typedef int elementType;
typedef struct SNode *Stack;
struct SNode{
 elementType data[MAXSIZE];  //声明一个静态数组,用于堆栈 
 int top; //标志栈顶 
};

压数据入栈操作:(此处要先判断栈是否已满,如果满了就返回空)

void Push(Stack PtrS, elementType iterm){
 if(PtrS->top == MAXSIZE-1){   //栈堆满了
  printf("堆栈满了");
  return; 
 }
 else{
  PtrS->data[++(PtrS->top)] = iterm;
  return;
 }
}

上面的这行代码:

PtrS->data[++(PtrS->top)] = iterm;

可以分开写成:

  ++(PtrS->top);
  PtrS->data[PtrS->top] = iterm;

意思都是一样的,就是先让指向原本栈顶的再向上挪一位,因为有新数据入栈。

下面是出栈操作:

elementType Pop(Stack PtrS){
 if(PtrS->top == -1){
  printf("堆栈空的");
  return 0;
 }
 else{
  return (PtrS->data[(PtrS->top)--]);
 }
}

此出栈函数和入栈差不多,开始要判断栈是不是为空。因为我们事先设定如果栈为空,top = -1 这个函数要返回一个数据,即我们想要弹出的数据,这里我们弹出的是elementType 即 int 类型。

下面是初始化一个栈的程序:

Stack InitStack(){
 Stack PtrS = (Stack)malloc(sizeof(struct SNode));
 PtrS->top = -1;
 return PtrS;
}

我们先要用 malloc 函数返回一个指向Stack类型(即struct SNode *)的地址空间,将地址赋给PtrS指针变量, 而且开始的时候我们要设置top = -1 然后返回这个指针。

接下来是主程序用于测试:

void main(){
 int n, m;
 Stack temp = InitStack();
 Push(temp, 12);
 Push(temp, 23);
 n = Pop(temp);
 m = Pop(temp);
 printf("%d\n",n);
 printf("%d\n",m);
}

先压入12 , 再压入23,然后弹出栈顶的数据(即23),再弹出一个数据(即12)。我们发现结果正确:
在这里插入图片描述

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值