数据结构中,栈是一种线性结构,数据元素遵循后进先出的原则。栈的一端为栈顶,一端为栈底或栈尾,数据只在栈顶端进行操作。新插入数据称为入栈或者压栈,删除数据叫做出栈或者退栈。
一、图文介绍
我们通过建立一个stack的数据结构进行栈的声明,栈的操作通过具体函数实现。stacksize代表栈的总大小,base指针指向栈底,top指针指向栈顶。
1.1,栈的初始化
我们初始化栈大小为30,也就是说最大存储元素为30个。
1.2,压栈
我们依次压入数据3,5,9,1,7五个元素,top指针随着数据压入二变动:
1.3,出栈
我们依次出栈7,1,5三个元素,top指针随着数据出栈而变动,栈内部的数据实际未动,后期压栈会覆盖。
二、代码实现
2.1,声明
我们定义要给t_stack.h头文件,内部进行结构体和方法声明:
#ifndef TEST1_T_STACK_H
#define TEST1_T_STACK_H
#define STACK_INIT_SIZE 30
#define STACK_INCREMENT 10
typedef int status;
typedef struct Stack{
int *base;
int *top;
int stacksize;
}stack;
status initStack(stack *);
status destroyStack(stack *);
status clearStack(stack *);
status stackIsEmpty(stack *);
int stackLength(stack *);
status getTop(stack *,int *);
status push(stack *,int data);
status pop(stack *);
void testStack();
#endif //TEST1_T_STACK_H
2.2,初始化函数
status initStack(stack *sqStack)
{
sqStack->base = (int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!sqStack->base)
{
printf("stack init failed!\n");
exit(0);
}
sqStack->top = sqStack->base;
sqStack->stacksize = STACK_INIT_SIZE;
return OK;
}
2.3,压栈函数
status push(stack *sqStack, int data)
{
if(sqStack->top-sqStack->base>=sqStack->stacksize)
{
sqStack->base = (int *)realloc(sqStack->base,(sqStack->stacksize+STACK_INCREMENT)*sizeof(int));
if(!sqStack->base)
{
printf("stack reallocate failed!\n");
exit(0);
}
sqStack->top = sqStack->base+sqStack->stacksize;
sqStack->stacksize +=STACK_INCREMENT;
}
*sqStack->top ++ = data;
return OK;
}
2.4,出栈函数
status pop(stack *sqStack)
{
if(sqStack->base == sqStack->top)
{
return ERROR;
}
--sqStack->top;
return OK;
}
2.5,取栈顶元素函数
status getTop(stack *sqStack,int *data )
{
if(sqStack->base==sqStack->top)
return ERROR;
*data = *(sqStack->top-1);
return OK;
}
2.6,销毁函数
status destroyStack(stack *sqStack)
{
free(sqStack);
return OK;
}
2.7,其他
status stackIsEmpty(stack *sqStack)
{
if(sqStack->base == sqStack->top)
{
return OK;
}
return ERROR;
}
int stackLength(stack *sqStack)
{
return sqStack->top-sqStack->base;
}
status clearStack(stack *sqStack)
{
sqStack->top = sqStack->base;
return OK;
}
三、测试
我们定义一个测试函数,进行测试:
void testStack()
{
stack *s = (stack *)malloc(sizeof(struct Stack));
int result = initStack(s);
push(s,3);
push(s,9);
push(s,5);
push(s,1);
push(s,7);
int data;
getTop(s,data);
printf("the top data is:%d\n",data);
pop(s);
getTop(s,data);
printf("the top data is:%d\n",data);
pop(s);
getTop(s,data);
printf("the top data is:%d\n",data);
pop(s);
getTop(s,data);
printf("the top data is:%d\n",data);
pop(s);
getTop(s,data);
printf("the top data is:%d\n",data);
destroyStack(s);
}
测试结果如下: