1.栈的概念
栈:一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除的一端称为栈顶,另一端称为栈底。栈中的数据元素遵循LIFO(Last in First out)的原则
压栈:栈的插入操作叫做压栈/进栈/入栈,入数据在栈顶
出栈:栈的删除操作叫出栈。出数据也在栈顶
2、栈的实现
- 创建
//用数组的方式实现栈
#pragma once
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
#include <stdlib.h>
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;//栈顶
int capacity;//容量,方便增容
}Stack;
2.初始化
#include "SeqStack.h"
void StackInit(Stack* s)
{
/*assert(s);
s->a = NULL;
s->top = 0;
s->capacity = 0;*/
s->a = (STDataType*)malloc(sizeof(STDataType)* 4);
s->top = 0;
s->capacity = 4;
}//初始化
- 销毁
void StackDestory(Stack* s)
{
assert(s);
free(s->a);
s->a = NULL;
s->capacity = s->top = 0;
}//销毁
- 入栈
oid StackPush(Stack* s, STDataType x)//性质决定在栈顶出入数据
{
assert(s);
if (s->top == s->capacity)
{
STDataType* tmp =(STDataType*)realloc(s->a,sizeof(STDataType)*s->capacity * 2);
if (tmp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
s->a = tmp;
s->capacity *= 2;
}
s->a[s->top] = x;
s->top++;
}//入栈
- 出栈
STDataType StackPop(Stack* s)
{
assert(s);
assert(!StackEmpty(s));
return s->a[s->top - 1];
}//出栈
- 返回栈顶元素
STDataType StackTop(Stack* s)
{
assert(s);
assert(!StackEmpty(s));
return s->a[s->top - 1];
}//返回栈顶元素
- 判断栈是否为空
bool StackEmpty(Stack* s)
{
//空返回1,非空返回0
assert(s);
return s->top == 0;
}//判断是否为空
- 查看栈中元素有多少
int StackSize(Stack* s)
{
assert(s);
return s->top;
}//栈中元素有多少