顺序栈的实现--C 语言版,详细讲解+代码实现

顺序栈的实现–C 语言版,详细讲解+代码实现



前言

数据结构的栈结构,所谓栈结构,和链式结构比较起来,他都为线性表,不一样的是,操作(插入和删除)不一样,在链表中,插入方法有头插法和尾插法,删除也能遍历删除。
而在栈中,插入和删除改变了说法成为出栈和入栈,其中,出栈就是删除元素,入栈就是插入元素。
不过和链式表比起来,栈的入栈和出栈操作只能从栈的尾部进行操作。而这种操作比起来貌似也更为简单。


一、栈的结构定义

顺序栈,可以简单的理解为栈的操作方式的数组,就是说在数组上,插入和删除时只在数组的末尾进行操作。
而顺序栈的结构体,也分为两部分,一部分是数组,可以理解为栈的实体,另一部分为top,栈顶的位置,为了迎合索引从零开始的设定,当栈中没有元素时,top赋值为0,当栈中出现出栈和入栈的操作时,随着操作top进行相加减即可。

#define MAXSIZE  100
typedef int selement_type;
typedef struct shunxuzhan
{
    selement_type data[MAXSIZE];
    int top;
}SEQ_STACK;

二、操作步骤

1.初始化

top讲解的话建议看前言
这边就是初始化一个结构体,结构体中有一个长度为100的数组和一个含义为栈顶位置的整形。

int init_stack(SEQ_STACK *seq_stack){
    seq_stack->top = -1;
    return 1;
}

2.入栈操作

入栈时,首先确认一下栈是否满员,由于我们创立结构体的时候定义了栈顶位置top,所以可以根据top直接判断,而且top的初始值是-1,它的值一直比当前长度少一位,所以比较栈是否满员的时候需要将MAXSIZE和top+1进行比较,当满员时直接返回,否则插入栈顶位置。

  1. 判断栈是否满员
  2. 给top+1意为这栈的长度+1,且栈顶元素更改
  3. 将要压入栈的值赋给新的栈顶。
//插入
int insert(SEQ_STACK *seq_stack,int data){
    if(seq_stack->top+1>=100){
        return 0;
    }else{
        seq_stack->top++;
        seq_stack->data[seq_stack->top]=data;
        return 1;
    }
}

3. 出栈操作

出栈操作时,首先也需要判断一下栈是否为空,由于定义top时,将其定义为,当栈为空的时候,top为-1,所以直接比较top即可。
当栈不为空的时候,进行删除,我当时写的时候本打算将top-1,然后将原本的栈顶元素置空,后来观察入栈操作发现,入栈的时候不会介意原本位置是否拥有数据,直接覆盖,而且栈的长度也有top负责管理,并不会出现问题。
所以写的时候只是将top-1,而并没有改变原本的栈顶元素的值。

  1. 判断栈是否为空
  2. 改变top的值,让top-1
//删除
int delete(SEQ_STACK *seq_stack){
    if(seq_stack->top==-1){
        return 0;
    }else{
        //seq_stack->data[seq_stack->top]=NULL;
        seq_stack->top--;
    }
}

4. 查看操作

这边的查看操作实际上是查看栈顶元素的操作,并非遍历。

  1. 判断栈是否为空
  2. 取出索引为top的数组的值。
//查看
int see(SEQ_STACK *seq_stack){
    if(seq_stack->top==-1){
        return 0;
    }else{
        int data = seq_stack->data[seq_stack->top];
        printf("%d\n",data);
        return 1;
    }
}

5.尝试

int main(){
    SEQ_STACK seq_stack;
    init_stack(&seq_stack);
    insert(&seq_stack , 1);
    insert(&seq_stack , 2);
    see(&seq_stack);
    delete(&seq_stack);
    see(&seq_stack);
    return 1;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值