栈
栈是一种先进后出的数据结构(属于线性表),它只允许在一端(栈顶)操作
就如弹夹装子弹
一、顺序栈
1.结构体
typedef int TypeData;
typedef struct node{
TypeData *arr;
int top;
int size;
}Stack, *Pstack;
2.栈的初始化
void stack_init(Pstack *S, int len)
{
*S = malloc(sizeof(Stack));
if(NULL == *S){
perror("malloc");
return ;
}
(*S)->arr = malloc(sizeof(TypeData)*len);
if(NULL == (*S)->arr){
perror("malloc");
return;
}
(*S)->top = -1;
(*S)->size = len;
}
3.空栈
bool stack_empty(Pstack s) //bool型,ture/false ,头文件stdbool.h
{
if(NULL == s){
puts("empty arg NULL");
return false;
}
if(-1 == s->top)
return true;
else
return false;
}
4.满栈
{
if(NULL == s){
puts("full arg NULL");
return false;
}
if(s->size-1 == s->top) //eg:size=len=2;(存两个数据),top=-1;top++;top++;top=1时,存入了两个数据
return true;
else
return false;
}
5.显示长度
int stack_len(Pstack s)
{
if(NULL == s){
puts("len arg NULL");
return -1;
}
return s->top+1; //长度=top+1
}
6.压栈
bool push_back(Pstack s, TypeData data)
{
if(NULL == s){
puts("push arg NULL");
return false;
}
if(stack_full(s)){
puts("push full");
return false;
}
s->top++; //因为s->top从-1开始,所以应该先+1
s->arr[s->top] = data;
return true;
}
7.出栈
bool pop_back(Pstack s, TypeData *pd) //返回值只做函数正确或错误调用的判断
{ //TypeData *pd 才是真正出栈的数据
if(NULL == s){
puts("pop arg NULL");
return false;
}
if(stack_empty(s)){
puts("pop empty");
return false;
}
*pd = s->arr[s->top--]; //出栈出arr[s->top]再top--
return true;
}
8.主函数
int main(int argc, char *argv[])
{
Pstack s;
stack_init(&s, 5);
TypeData data;
while(1){
scanf("%d", &data);
if(!push_back(s, data)) //如果压栈失败(栈满了),返回
break;
}
printf("len:%d\n", stack_len(s));
return 0;
}
二、链栈
1.结构体
typedef int TypeData;
typedef struct node{
TypeData data;
struct node *top; //在顶端操作
}LinkStack, *PLinkStack;
2.初始化栈
bool stack_init(PLinkStack *S)
{
*S = malloc(sizeof(LinkStack));
if(NULL == *S)
return false;
(*S)->top = NULL;
return true;
}
3.栈空
bool stack_empty(PLinkStack s)
{
if(NULL == s)
return false;
if(NULL == s->top)
return true;
else
return false;
}
4.出栈
bool stack_pop(PLinkStack s, TypeData *data)
{
if(stack_empty(s) || NULL == s)
return false;
*data = s->top->data;
PLinkStack p = s->top;
s->top = p->top; //s->top = s->top->top
free(p);
return true;
清除栈就是循环的出栈,直到栈空
}
5.压栈
bool stack_push(PLinkStack s, TypeData data)
{
if(NULL == s)
return false;
PLinkStack p = malloc(sizeof(LinkStack));
if(NULL == p)
return false;
p->data = data;
p->top = s->top;
s->top = p;
return true;
}
6.清除栈
bool stack_clear(PLinkStack s)
{
if(NULL == s || stack_empty(s))
return false;
PLinkStack p;
while(NULL != s->top){ //while(s->top)
p = s->top;
s->top = p->top; //s->top = s->top->top;
free(p);
}
return true;
}