一:栈
.什么是栈?
只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底
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;
}