我们这里说的栈其实本质上还是一种表结构,只不过栈是一种表的特殊情况,即功能受限的表,栈是只有一个进出口的表结构,先进先出。既然它是表结构的一种,当然也分顺序存储和链式存储两种,本文主要介绍顺序栈的构建以及运算:
老规矩,先起别名
#define TYPE int
定义一下顺序栈的结构
typedef struct ArrayStack
{
TYPE *ptr;
size_t cap;
size_t top;
}ArrayStack;
创建
//创建
ArrayStack *create_stack(size_t cap)
{
ArrayStack *stack=malloc(sizeof(ArrayStack));
stack->ptr=malloc(sizeof(TYPE)*cap);
stack->cap=cap;
stack->top=0;
return stack;
}
销毁
//销毁
bool destroy_stack(ArrayStack *stack)
{
free(stack->ptr);
stack->ptr=NULL;
free(stack);
stack=NULL;
return true;
}
入栈
//入栈
bool in_stack(ArrayStack *stack,TYPE val)
{
if(stack->cap<=stack->top) return false;
stack->ptr[stack->top++]=val;
return true;
}
出栈
//出栈
bool out_stack(ArrayStack *stack)
{
if(!stack->top) return false;
stack->top--;
return true;
}
栈顶
//栈顶
bool top_stack(ArrayStack *stack,TYPE *val)
{
if(!stack->top) return false;
*val=stack->ptr[stack->top-1];
return true;
}
主函数里浅浅测试一下:
int main(int argc,const char* argv[])
{
TYPE val;
ArrayStack *stack=create_stack(10);
for(int i=0;i<stack->cap;i++)
{
in_stack(stack,i+1);
}
//if(destroy_stack(stack)) printf("destroy success\n");
//out_stack(stack);
//out_stack(stack);
int b[]={3,2,1,4,5,8,7,6,9,10};
if(is_pop_stack(stack,b,10)) printf("b是a的出栈顺序!\n");
else printf("b不是a的出栈顺序,请注意!\n");
while(stack->top)
{
top_stack(stack,&val);
printf("%d ",val);
stack->top--;
}
return 0;
}
栈的应用主要分布在: 1、函数的调用、栈内存特点
2、生产者和消费者模型(仓库->栈)
3、表达式解析 3-3*20/2
over