C语言数组实现栈的基本功能

了解栈

栈是数据结构中最常见的一种数据类型,有着一端数据插入删除的特性,及我们所说的后进先出。今天我们使用C数组来完成栈的基本功能,判断栈满、栈空,入栈,出栈,取栈顶元素等基本功能。而我们知道数组的存储方式是依次存放,假设int型(4字节)数组a[0]的物理存储地址是100000,则a[1]的物理存储地址是100004,其中与栈的线性存储很相似。有实现的可能性。
在这里插入图片描述

上图就是一个基本的栈的模型图,废话不多说,直接开撸:

1.老规矩,新建一个.h头文件定义函数原型

//
// Created by ASUS on 2022/1/10.
//

#define MAX_SIZE 20

//判断栈空
int is_full();
//判断栈空
int is_empty();
//出栈
int pop();
//压栈
void push(int element);
//获取栈顶元素
int top();


上面代码定义了我们需要的函数原型以及一个数组大小的常量
2. 为函数原型添加具体实现

//
// Created by ASUS on 2022/1/10.
//
#include<stdio.h>
#include "stack.h"

int stack[MAX_SIZE];
int position;

//判断栈空
int is_full() {
    //判断栈是否为满,满则返回1,否则返回0
    return position >= MAX_SIZE;
}

//判断栈空
int is_empty() {
    //当栈位置为零则为空
    return position == 0;
}

//出栈
int pop() {
    //判断栈是否为空
    if (is_empty()) {
        return 0;
    }
    int element = stack[--position];
    //删除与否意义不大,下次压栈数据会替换会替换
    return element;
}

//压栈
void push(int element) {
    //判断栈满
    if (is_full()) {
        return;
    }
    stack[position++] = element;
//    position +=1;
}

//获取栈顶元素
int top() {
    if (is_empty()) {
        return 0;
    }
    //position位置未修改
    int element = stack[position - 1];
}


这部分代码的核心就是全局变量position和一个大小为20的数组,其中position其实就是一个用于与数组下标进行比较的值。如a[i]中的i是相同性质的。
项目的运行流程:

  • [1] 全局变量position初始化为0,数组初始化为含0数组

  • [2] 此时数组为空,即为栈空

  • [3]当push()一个元素时,此时将stack[position]赋值为添加的element,并将position后移一位
    在这里插入图片描述

  • [4]当pop()元素时,将position先前移一位,到达元素位置,取出该值,此时删除该元素与否都可
    在这里插入图片描述

  • [5]获取栈顶元素与判空,判满都一样,都是对position操作

  1. 创建main函数调用方法
//
// Created by ASUS on 2022/1/10.
//

#include<stdio.h>
#include "stack.h"

int main() {

    printf("the stack is empty?%d\n", is_empty());
    push(10);
    push(20);
    push(30);
    push(40);
    printf("the stack is full? %d\n", is_full());
    printf("pop is :%d\n", pop());
    printf("pop is :%d\n", pop());
    printf("the stack is empty?%d\n", is_empty());
    printf("the stack of top is %d", top());
    printf("pop is :%d\n", pop());
    printf("pop is :%d\n", pop());
    printf("the stack is full? %d\n", is_empty());
    for (int i = 0; i < 20; i++) {
        push(i);
    }
    printf("pop is :%d\n", pop());
    printf("pop is :%d\n", pop());
    printf("Oh success!!");
    return 0;
}

  1. 运行结果截图
    在这里插入图片描述

总结

优化点:
大家可以考虑使用动态数组来进行优化,这样push时就可以动态扩增
同时可以考虑一下小端存储的实现方式,即 新增的值存在物理低地址,思想一致就是有点反人类,有点难想象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值