栈学习小结
栈的概念
栈是一种特殊的线性表,只有一头能存入、输出数据,符合Last in First out原则。
栈的类型
有数组栈和链式栈两种。本次小结只关于数组栈。
栈的定义
动态数组栈
typedef int StackDataType; //将int重定义为StackDataType,方便更改动态数组的数据类型
typedef struct Stack
{
StackDataType* array; //指向动态数组的指针
int top; //表示栈顶
int capacity; //栈的长度
}Sta; //重定义为Sta,方便调用
静态数组栈
typedef int StackDataType;
typedef struct Stack
{
StackDataType array[N];
int top ;
}Sta;
栈的初始化
void StackInit(Sta* sql)
{
assert(sql);//防止空栈
sql->array = NULL;
sql->top = 0;
sql->capacity = 0;
}
栈的销毁
void StackDestory(Sta* sql)
{
assert(sql);
free(sql->array);
sql->array = NULL;
sql->top = sql->capacity = 0;
}
判断栈是否为空
bool StackIsEmpty(Sta* sql) //返回值类型为bool,要引用stdbool.h
{
assert(sql);
if (sql->top == 0) //如果sql->top 为0,说明栈内没有数据
return true;
else
return flase;
}
入栈
void StackPush(Sta* sql,StackDataType x)
{
assert(sql);
if(sql->top == sql->capacity)//判断是否需要扩容
{
int new_capacity = sql->capacity == 0 ? 4 : 2*sql->capacity;
StackDataType* new_array = relloc(sql->array,sizeof(StackDataType) * new_capacity);
if (new_array == NULL)//以防扩容失败
{
printf("relloc failed\n");
exit(-1);
}
sql->array = new_array;
sql->capacity = new_capacity;
}
sql->array[sql->top] = x;//将数组中下标为sql->top赋值为x
sql->top++;//栈顶加一
}
出栈
void StackPop(Sta* sql)
{
assert(sql);
sql->top--;
}
打印栈顶数据
void StackTop (Sta* sql)
{
assert(sql);
while (sql->top != 0)
{
printf("%d\n", sql->arrqy[sql->top - 1]);//初始化sql->top为0时需要-1。
sql->top--;
}
}
返回栈的大小
StackDataType StackSize (Sta* sql)
{
assert(sql);
return sql->top;//初始化sql->top为0时直接,sql->top就是大小。
}