一、栈的顺序存储
1、
栈(Stack)是一个后进先出(Last in first out,LIFO)的线性表,它要求只在表尾进行删除和插入操作。也就是一个特殊的线性表(顺序表、链表。
- 栈的元素必须“后进先出”。
- 栈的操作只能在这个线性表的表尾进行。
1.1基本操作
1)初始化栈
2)入栈
3)出栈
4)返回栈的大小
5)返回栈顶元素
6)判断栈是否为空
7)销毁栈
操作 1.2初始化栈
seqStack init_Stack()
{
struct sStack* myStack = malloc(sizeof(struct sStack));
if (myStack == NULL)
{
return NULL;
}
memset(myStack->data, 0, sizeof(void*) * Max);
myStack->m_size = 0;
return myStack;
}
入栈
void push_Stack(seqStack stack, void* data)
{
if (stack == NULL||data==NULL)
{
return;
}
//尾插
struct sStack* myStack = stack;
if (myStack->m_size == Max)
{
return;
}
myStack->data[myStack->m_size] = data;
myStack->m_size++;
}
出栈 并且将栈的数组逐个置为空,同时栈的大小逐个减少
void pop_Stack(seqStack stack)
{
if (stack == NULL)
{
return;
}
struct sStack* myStack = stack;
if (myStack->m_size == 0)
{
return;
}
myStack->data[myStack->m_size - 1] = NULL;
myStack->m_size--;
}
返回栈
int size_Stack(seqStack stack)
{
if (stack == NULL)
{
return -1;
}
struct sStack* myStack = stack;
return myStack->m_size;
}
返回栈顶元素
void* top_Stack(seqStack stack)
{
if (stack == NULL)
{
return NULL;
}
struct sStack* myStack = stack;
if (myStack->m_size == 0)
{
return NULL;
}
return myStack->data[myStack->m_size-1];
}
栈顶元素即为最后入栈的元素,所以取数组中下标最大元素
判断栈并且销毁栈
int isEmpty_Stack(seqStack stack)
{
if (stack == NULL)
{
return -1;
}
struct sStack* myStack = stack;
if (myStack->m_size == 0)
{
return 1;
}
return 0;
}
//这里如果栈原始为空返回-1,栈中元素个数为0返回1,否则返回0
void destory_Stack(seqStack stack)
{
if (stack == NULL)
{
return;
}
free(stack);
stack = NULL;