栈
1.什么是栈?
只能在一端进行插入和删除操作的线性表(又称为堆栈),
进行插入和删除操作的一端称为栈顶,另一端称为栈底
- 栈特点:
先进后出 FILO first last in out
后进先出 LIFO
顺序栈 :sequeue 顺序 stack 栈
逻辑结构:线性结构
存储结构:顺序存储(数组)
SeqStack.h
/**
** Created by 24122 on 2022/4/23.
**/
#ifndef DATASTRUCTURE_SEQSTACK_H
#define DATASTRUCTURE_SEQSTACK_H
typedef int datatype;
typedef struct
{
datatype *data;
int length;
int top;
}seqstack_t;
/**
* 1.创建顺序栈
*/
seqstack_t *CreateSeqStack(int length);
/**
* 2.入栈
*/
int PushStact(seqstack_t *p,datatype data);
/**
* 3.判断栈是否满
*/
int SeqStackIsFull(seqstack_t *p);
/**
* 4.出栈
*/
int PopStack(seqstack_t *p);
/**
* 5.判断栈是否为空
*/
int SeqStackIsEmpty(seqstack_t *p);
/**
* 6.求栈的长度
*/
int SeqStackLength(seqstack_t *p);
/**
* 7.获取栈顶的值
*/
datatype SeqStackTopData(seqstack_t *p);
/**
* 8.清空栈
*/
void SeqStackClear(seqstack_t *p);
/**
* 9.销毁栈
*/
void SeqStackDestroy(seqstack_t **sp);
#endif //DATASTRUCTURE_SEQSTACK_H
SeqStack.c
/**
** Created by 24122 on 2022/4/23.
**/
#include <stdio.h>
#include <stdlib.h>
#include "SeqStack.h"
/**
* 1.创建顺序栈
*/
seqstack_t *CreateSeqStack(int length)
{
//1.创建一个保存栈信息的结构体
seqstack_t *p = (seqstack_t *) malloc(sizeof (seqstack_t));
//2.容错判断
if(p == NULL)
{
printf("CreateSeqStack error!\n");
return NULL;
}
//3.初始化
p->data = (datatype *) malloc(sizeof (datatype) * length);
//4。容错判断
if(p->data ==NULL)
{
printf("CreateStack error!\n");
return NULL;
}
p->length=length;
p->top = -1;//空栈
return p;
}
/**
* 2.入栈
*/
int PushStact(seqstack_t *p,datatype data)
{
if(SeqStackIsFull(p)){
printf("PushStact error\n");
return -1;
}
//2.插入数据:1.先让栈针后移,在赋值,
// 2.先向下一个位置赋值在加一
p->top++;
//*((p->data)+p->top) =data;
p->data[p->top] = data;
//printf("%4d入栈 ", p->data[p->top]);
return 0;
}
/**
* 3.判断栈是否满
*/
int SeqStackIsFull(seqstack_t *p)
{
return p->top +1 ==p->length;// 1:满 0: 不满
}
/**
* 4.出栈
*/
datatype PopStack(seqstack_t *p)
{
datatype tmp;
//1.容错处理
if(SeqStackIsEmpty(p))
{
printf("PopStack error\n");
return -1;
}
//1.数据出栈
// printf("%4d出栈 ", p->data[p->top]);
tmp=p->data[p->top];
p->top--;
return tmp;
// return p->data[p->top];
}
/**
* 5.判断栈是否为空
*/
int SeqStackIsEmpty(seqstack_t *p)
{
return p->top == -1; // 1:空 0:非空
}
/**
* 6.求栈的长度
*/
int SeqStackLength(seqstack_t *p)
{
if(SeqStackIsEmpty(p))
{
printf("SeqStackLength error\n");
return -1;
}
return p->top+1;
}
/**
* 7.获取栈顶的值
*/
datatype SeqStackTopData(seqstack_t *p)
{
if(SeqStackIsEmpty(p))
{
printf("SeqStackTopData error\n");
return -1;
}
return p->data[p->top];
}
/**
*
* 8.清空栈
*/
void SeqStackClear(seqstack_t *p)
{
p->top=-1;
}
/**
* 9.销毁栈
*/
void SeqStackDestroy(seqstack_t **sp)
{
free((*sp)->data);
free(*sp);
*sp=NULL;
}
main.c
/**
** Created by 24122 on 2022/4/23.
**/
#include <stdlib.h>
#include <stdio.h>
#include "SeqStack.h"
#define N 10
int main()
{
seqstack_t *p = CreateSeqStack(N);
//入栈
for (int i = 1; i <= 10; i++) {
PushStact(p, i);
}
//出栈
while (!SeqStackIsEmpty(p))
{
printf("%d ", PopStack(p));
}
putchar(10);
/*//长度
int i=SeqStackLength(p);
printf("%d",i);
//栈顶的值
int j=SeqStackTopData(p);
printf("%d",j);
SeqStackClear(p);
printf("SeqStackIsEmpty:%d", SeqStackIsEmpty(p));
SeqStackDestroy(&p);
printf("p:%p", p);*/
return 0;
}