1.概念
栈是只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底。
特点:栈是先进后出FILO(First In Last Out)或( LIFO(Last In First Out))
逻辑结构:线性结构
存储结构:顺序存储
特点:内存连续,大小固定。
操作:创建、入栈、出栈、判空和判满。
2.结构体
顺序栈的结构体
// 顺序栈
typedef struct seqstack
{
datatype *data; // 指向栈的存储位置
int maxlen; // 保存栈的最大长度
int top; // 称为栈针,用的时候,心里面可以将按照顺序表里的last来使用
// top 始终代表当前栈内最后一个有效元素的下标
} seqstack_t, *seqstack_p;
// 创建结构体
3.创建空栈
步骤:
(1)malloc一块结构体大小的空间用来保存结构体
(2)开辟一块存放数据的空间
// 1.创建一个空的栈
seqstack_t *CreateEpSeqStack(int len) // len代表的是创建栈的时候的最大长度
{
// 开辟空间,保存结构体
seqstack_t *p = (seqstack_t *)malloc(sizeof(seqstack_t));
if (NULL == p)
{
printf("CreateEpSeqStack error.\n");
return NULL;
}
// 初始化
p->maxlen = len; // 最大长度为传入得参数len
p->top = -1; // 有效元素最大下标,刚开始没有元素,初始化为-1
p->data = (datatype *)malloc(sizeof(datatype) * len); // 开辟空间存放数据,强制转换为数据的数据类型(int)
if (p->data == NULL)
{
perror("error \n");
return NULL;
}
return p;
}
4.入栈
(1)判断栈是否满
(2)移动栈针
(3)插入数据
// 3.入栈
// data代表入栈的数据
int PushStack(seqstack_t *p, datatype data)
{
if (IsFullSeqStack(p))
{
perror("push error 无法入栈");
return -1;
}
// 栈针上移,然后赋值
p->top++;
p->data[p->top] = data;
return 0;
}
5.出栈
步骤:
(1)判空
(2)返回数据,输出数据
(3)移动栈针
// 5.出栈,一次出栈一个元素
int PopSeqStack(seqstack_t *p)
{
if (IsEpSeqStack(p))
{
perror("栈为空,无法出栈");
return -1;
}
int res = p->data[p->top];
p->top--;
return res;
}
// 5.出栈,一次性全部出栈
int PopSeqStack(seqstack_t *p)
{
if (IsEpSeqStack(p))
{
perror("栈为空,无法出栈");
return -1;
}
循环出栈
while (p->top != -1)
{
printf("%d ", p->data[p->top]);
p->top--;
}
printf("\n");
return 0;
}
6.其他操作
判满:当栈针(等同于下标)等于最大长度减一时,栈满
判空:当栈针为-1时,表示栈中没有元素,为空。
// 2.判断是否为满,满返回1 未满返回0
int IsFullSeqStack(seqstack_t *p)
{
return p->top == p->maxlen - 1;
}
// 4.判断栈是否为空
int IsEpSeqStack(seqstack_t *p)
{
return p->top == -1;
}
清空栈:只需要让栈针等于-1即可,虽然元素还在,但是在电脑眼中,栈已经为空
// 6. 清空栈
void ClearSeqStack(seqstack_t *p)
{
p->top == -1;
}
获取栈顶元素:注意不是出栈操作,如果出栈,相当于删除了栈顶数据,只是将栈顶的数据获取到,不需要移动栈针
// 7. 获取栈顶数据(注意不是出栈操作,如果出栈,相当于删除了栈顶数据,只是将栈顶的数据获取到,不需要移动栈针)
int GetTopSeqStack(seqstack_t *p)
{
int res;
res = p->data[p->top];
return res;
}
求栈的长度:只需要用栈针数值加一即可
// 8. 求栈的长度
int LengthSeqStack(seqstack_t *p)
{
int length = 0;
length = p->top + 1;
return length;
}