栈的使用(先入后出)

一:栈

.什么是栈?

只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底

2. 栈特点

先进后出 FILO first in last out LIFO

3.1顺序栈

1逻辑结构线性结构

2存储结构顺序存储

3操作入栈出栈

typedef struct seqstack

{

int *data;

int maxlen;

int top;

}seqstack_t;

 二:头文件

#ifndef _SEQSTACK_H_
#define _SEQSTACK_H_
#include <stdio.h>
#include <stdlib.h>

typedef struct seqstack
{
	int* data;//指向栈的存储位置
	int maxlen;//保存栈的最大长度
	int top;//称为栈针,用的时候,心里面可以将按照顺序表里的last来使用
			//top 始终代表当前栈内最后一个有效元素的下标
}seqstack_t;
//1.创建一个空的栈
seqstack_t *CreateEpSeqStack(int len);//len代表的是创建栈的时候的最大长度
//2.判断是否为满,满返回1 未满返回0
int	 IsFullSeqStack(seqstack_t *p);
//3.入栈 
int  PushStack(seqstack_t *p, int data);//data代表入栈的数据
//4.判断栈是否为空
int IsEpSeqStack(seqstack_t *p);
//5.出栈 
int PopSeqStack(seqstack_t *p);
//6. 清空栈 
void ClearSeqStack(seqstack_t *p);
//7. 获取栈顶数据(注意不是出栈操作,如果出栈,相当于删除了栈顶数据,只是将栈顶的数据获取到,不需要移动栈针)
int GetTopSeqStack(seqstack_t *p);
//8. 求栈的长度
int LengthSeqStack(seqstack_t *p);

#endif 

 三:代码实现

#include "seqstack.h"

//1.创建一个空的栈
seqstack_t *CreateEpSeqStack(int len)//len代表的是创建栈的时候的最大长度
{
    //先对结构体开辟空间
    seqstack_t *p=( seqstack_t *)malloc(sizeof(seqstack_t));
    if(p==NULL)
    {
        perror("CreateEpSeqStack err");
        return NULL;
    }
    //初始化
     p->top=-1;
    p->maxlen=len;
    //对data开辟空间,大小取决于len
    p->data=(int *)malloc(sizeof(int)*len);
    if(p->data==NULL)
    {
        perror("CreateEpSeqStack err");
        free(p);//若未开辟成功,释放p的空间
        return NULL;
    }
    return p;
}
//2.判断是否为满,满返回1 未满返回0
int	 IsFullSeqStack(seqstack_t *p)
{
    return p->top=p->maxlen-1;
}

//3.入栈 
int  PushStack(seqstack_t *p, int data)//data代表入栈的数据
{
    //容错判断
    if(IsFullSeqStack(p))//判断栈是否为满
    {
        perror("栈满");
        return -1;
    }
    //移动栈针
   p->top++;
   //赋值
   p->data[p->top]=data;
   return 0;
}

//4.判断栈是否为空
int IsEpSeqStack(seqstack_t *p)
{
    return p->top==-1;
}
//5.出栈 
int PopSeqStack(seqstack_t *p)
{
    //判断栈是否为空
    if(IsEpSeqStack(p))
    {
        perror("栈空");
        return -1;
    }
    //移动栈针
    p->top--;
    //返回
    return p->data[p->top+1];
}
//6. 清空栈 
void ClearSeqStack(seqstack_t *p)
{
    p->top=-1;
}
//7. 获取栈顶数据(注意不是出栈操作,如果出栈,相当于删除了栈顶数据,只是将栈顶的数据获取到,不需要移动栈针)
int GetTopSeqStack(seqstack_t *p)
{
    if(IsEpSeqStack(p))
    {
        perror("栈空:");
        return -1;
    }
    //p=p->top;
    return p->data[p->top];
}
//8. 求栈的长度
int LengthSeqStack(seqstack_t *p)
{
    return p->top+1;
    // int sum=0;
    // if(p->top!=0)
    // return p->top;
    // p->top--;
    // sum++;
    // return -1;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值