目录
1.7 判断栈是否为空:为空返回true,不为空返回false
1. C语言栈的实现
栈后入先出的特性,跟数组尾部的插入删除是O(1)很适合,所以用一个动态增长的数组来实现栈
栈的主要功能
1.1 栈的结点结构体设计:
创建结构体类型StackNode
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int StackDataType;
typedef struct StackNode
{
StackDataType* _stack;//栈
int _capacity;//栈的容量
int _top;//栈顶元素位置
}Stack;
1.2 栈的初始化:
void StackInit(Stack* st)
{
st->_stack = NULL;
st->_capacity = 0;
st->_top = 0;
}
//首先先把栈内的数组置为空 top\capacity都置为0
top这里设计的是指向栈顶元素的下一个元素,top也就是栈内有效元素的个数。而数组因为下表,最后一个元素的在数组中的位置需要-1
1.3栈的插入:插入前判断是否需要扩容
void StackPush(Stack* st, StackDataType data)
{
assert(st);
if (st->_capacity == st->_top)//判断是否需要扩容
{
int newCapacity = st->_capacity == 0 ? 4 : 2 * st->_capacity;//新容量判定
st->_stack = (StackDataType*)realloc(st->_stack, newCapacity * sizeof(StackDataType));//扩容
st->_capacity = newCapacity;
}
st->_stack[st->_top] = data;
st->_top++;
}
1.4 栈的删除:将栈的top--
void StackPop(Stack* st)
{
assert(st);
assert(st->_top);
st->_top--;
}
1.5 返回栈顶元素;返回top-1的位置
StackDataType StcakTop(Stack* st)
{
assert(st);
return st->_stack[st->_top - 1];
}
1.6 返回栈内有效元素个数
int StackSize(Stack* st)
{
assert(st);
return st->_top;
}
1.7 判断栈是否为空:为空返回true,不为空返回false
bool StackEmpty(Stack* st)
{
assert(st);
if (st->_top == 0)
{
return true;
}
else
{
return false;
}
}
1.8 删除栈:释放申请的空间
void StackDestory(Stack* st)
{
assert(st);
if (st->_stack != NULL)
{
free(st->_stack);
}
st->_capacity = st->_top = 0;
}