第二节
栈:栈是功能受限的表,只有一个接口管理数据的进出,其特点是先进后出
顺序栈:容量有限(容器)
出入栈都是以下标为基础,一般常用于,表达式解析,内存管理(为函数调用提供支持)
typedef struct StackArray
{
TYPE* arr; // 存储空间首地址
int top; // 栈顶
size_t len; // 容量
}StackArray;
// 创建
StackArray* create_stack_array(size_t len)
{
StackArray* stack = malloc(sizeof(StackArray));
stack->arr = malloc(sizeof(TYPE)*len);
stack->len = len;
stack->top = 0;
}
// 销毁
void destory_stack_array(StackArray* stack)
{
free(stack->arr);
free(stack);
}
// 栈空
bool empty_stack_array(StackArray* stack)
{
return !stack->top;
}
// 栈满
bool full_stack_array(StackArray* stack)
{
return stack->top >= stack->len;
}
// 入栈
bool push_stack_array(StackArray* stack,TYPE data)
{
if(full_stack_array(stack)) return false;
stack->arr[stack->top++] = data;
return true;
}
// 出栈
bool pop_stack_array(StackArray* stack)
{
if(empty_stack_array(stack)) return false;
stack->top--;
return true;
}
// 栈顶
TYPE* top_stack_array(StackArray* stack)
{
if(empty_stack_array(stack)) return NULL;
return stack->arr + stack->top - 1;
}
链式栈:容量可以是无限的
Node* create_node(TYPE data)//创建结点
{
Node* node = malloc(sizeof(Node));
node->data = data;
node->next = NULL;
return node;
}
Stack* create_stack(void)//创建链式栈
{
Stack* stack = malloc(sizeof(Stack));
stack->top = NULL;
return stack;
}
bool empty_stack(Stack* stack)栈空
{
return stack->top == NULL;
}
bool pop_stack(Stack* stack)//出栈
{
if(empty_stack(stack)) return false;
Node* temp = stack->top;
stack->top = temp->next;
free(temp);
return true;
}
void destory_stack(Stack* stack)//销毁栈
{
while(!empty_stack(stack))
{
pop_stack(stack);
}
free(stack);
}
void push_stack(Stack* stack,TYPE data)//入栈
{
Node* node = create_node(data);
node->next = stack->top;
stack->top = node;
}
bool top_stack(Stack* stack,TYPE* p)//栈顶
{
if(empty_stack(stack)) return false;
*p = stack->top->data;
return true;
}