数据结构——栈的顺序存储及其基础操作(C语言实现)

BB Time

上个学期数据结构专业课又双叒叕水过去了
到学期末我才发现我竟然连链表都没有自己敲过
所以这个假期第一件事就是把数据结构认认真真学一遍

一、栈

1、概念

栈示意图

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

2、数据结构

typedef struct {
    int TOP;//栈顶指针
    int Data[MAX];//数据
} TypeStack;

3、功能函数

初始化栈:TypeStack *InitStack();
判满:int IfFull(TypeStack *Stack);//满返回1
判空:int IfEmpty(TypeStack *Stack);//空返回1
入栈:void Push(TypeStack *Stack);
出栈:int Pop(TypeStack * Stack);
打印栈:void Print(TypeStack *Stack);

二、栈基础功能

出入栈示意图

1、判空

(1)原理

初始化栈的时Stack->Top值为-1,每个元素入栈时Stack->Top自增1。所以当Stack->Top值为-1时栈为空

(2)代码

int IfEmpty(TypeStack *Stack) {
    if (Stack->TOP == -1)
        return 1;
    return 0;
}

2、判满

(1)原理

宏定义MAX值为栈最大元素数。栈中的第一个元素从下标0开始,所以当Stack->Top值为MAX-1时,栈满

(2)代码

int IfFull(TypeStack *Stack) {
    if (Stack->TOP == MAX-1)
        return 1;
    return 0;
}

3、入栈

(1)原理

入栈示意图
如图,元素入栈时,元素填入栈顶,即数组中下标为Stack->Top的一项——Stack->Data[Stack->Top]。元素进入后,栈顶指示器上移一位

(2)代码

void Push(TypeStack *Stack) {
    if (IfFull(Stack)) {
        printf("\n!!!栈已满,无法入栈!!!\n");
        return;
    }
    printf("输入待入栈的值;");
    Stack->TOP++;
    scanf("%d",&Stack->Data[Stack->TOP]);
}

4、出栈

(1)原理

出栈示意图
栈中元素出栈时,用变量x保存栈顶元素,栈顶指示器下移

(2)代码

int Pop(TypeStack *Stack) {
    int x = Stack->Data[Stack->TOP];
    Stack->TOP--;
    return x;
}

三、两栈共享存储空间

1、原理

使用多个栈时可能会出现一个栈溢出,但是其他的栈还有多余空间的情况,这种情况如果可以把未满栈的空间给已满栈使用,就能进一步提高存储空间利用率。
实现起来比较简单。数组头尾两个端点分别表示两个栈的栈底——一个栈的栈底为数组始端,另一个栈的栈底为末端,两个栈元素入栈时Stack->Top向数组中部延伸,只要两个栈顶指示器不碰面,就说明栈依旧未满,可以继续入栈

2、数据结构

typedef struct {
	int Top1;
	int Top2;
	int Data[MAX];
}

2、源代码

(稍后上传到Github)

四、问题总结

1、宏定义

在定义栈的结构体时用到了宏定义MAX表示栈中元素最大值

#define MAX 5

给宏定义赋值的时候不用=!!!不用赋值号啊!

五、源代码

栈的顺序存储

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值