首先:要了解栈这样一种结构。
栈:一种特殊的线性结构,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任何元素地栈称为空栈,栈又称为后进先出的线性表。
![]()
基于动态顺序表实现的栈,实现以下操作:
- 入栈操作
- 出栈操作
- 取栈顶元素
为了更好地实现以上操作,需要对栈进行初始化与销毁,容量不够时自动扩容的操作。
顺序栈声明如下:
#pragma once
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
typedef char StackType;
typedef struct SeqStack
{
StackType* data;
size_t size;
size_t capacity;
}SeqStack;
void SeqStackInit(SeqStack* seqstack);
void SeqStackDestroy(SeqStack* seqstack);
void SeqStackPush(SeqStack* seqstack,StackType value);
void SeqStackPop(SeqStack* seqstack);
int SeqStackTop(SeqStack* seqstack,StackType* value);
初始化
void SeqStackInit(SeqStack* seqstack)
{
if(seqstack==NULL)
{
return;//非法输入
}
seqstack->size=0;
seqstack->capacity=1024;
seqstack->data=(StackType*)malloc(seqstack->capacity*sizeof(StackType));
}
入栈
void SeqStackPush(SeqStack* seqstack,StackType value)
{
if(seqstack==NULL)
{
return;//非法输入
}
if(seqstack->size>=seqstack->capacity)
{
SeqStackReSize(seqstack);
}
seqstack->data[seqstack->size++]=value;
}
扩容
扩容时,扩容策略由自己设置,在这里用原大小*2+1,原因是STL的扩容原则就是*2,+1是排除了原大小可能是0的可能性。
扩容完毕,要将原来的数据搬运过来,并且释放掉原来那些不用的内存,以防内存泄漏。
void SeqStackReSize(SeqStack* seqstack)
{
if(seqstack==NULL)
{
return;
}
StackType* new_ptr=NULL;
if(seqstack->size>=seqstack->capacity)
{
new_ptr=(StackType*)malloc(seqstack->capacity*sizeof(StackType)*2+1);
}
size_t i=0;
for(i=0;i<seqstack->size;i++)
{
new_ptr[i]=seqstack->data[i];
}
free(seqstack->data);
seqstack->data = new_ptr;
}
出栈
void SeqStackPop(SeqStack* seqstack)
{
if(seqstack==NULL)
{
return;
}
if(seqstack->size==0)
{
return;
}
--seqstack->size;
}
取栈顶元素
int SeqStackTop(SeqStack* seqstack,StackType* value)
{
if(seqstack==NULL)
{
return 0;
}
if(seqstack->size==0)
{
return 0;
}
*value=seqstack->data[seqstack->size-1];//注意:这里是减一,不能减减
return 1;
}
销毁
void SeqStackDestroy(SeqStack* seqstack)
{
if(seqstack==NULL)
{
return;//非法输入
}
seqstack->size=0;
free(seqstack->data);
}