乐趣区

数据结构-顺序存储结构栈

顺序存储结构 - 栈

//stack.c
#include <stdio.h>
#include <stdlib.h>

// 类型
typedef struct node{

    int *data;
    int size;
    int top;
}stack_tt;
// 创建
stack_tt* create_stack(int size)
{if(size<=0)
        return NULL;

    stack_tt* stack=malloc(sizeof(stack_tt));

    stack->size=size;
    stack->top=-1;// 为空
    stack->data=malloc(sizeof(int)*size);

    return stack;
}
// 判空
int isnull_stack(stack_tt* stack)
{if(stack==NULL)
        return 0;

    return stack->top==-1;
}
// 判满
int isfull_stack(stack_tt* stack)
{if(stack==NULL)
        return 0;

    return stack->top==stack->size-1;
}
// 入栈  push
int push_stack(stack_tt* stack,int data)
{
    //1
    if(stack==NULL||isfull_stack(stack))
        return -1;

    //2
    stack->data[stack->top+1]=data;
    
    //3
    stack->top++;

    return 0;
}
// 出栈 pop   将数据取出  返回值能返回取出的值么???int pop_stack(stack_tt* stack,int *data)
{if(stack==NULL||isnull_stack(stack))
        return -1;

    *data=stack->data[stack->top--];
    return 0;
}

// 打印(假)int print_stack_notreal(stack_tt* stack)
{if(stack==NULL||isnull_stack(stack))
        return -1;

    int i;
    for(i=stack->top;i>=0;i--)
    {printf("%3d",stack->data[i]);
        
    }
    printf("\n");

    return 0;
}
// 看一眼  view   只能看到栈的顶部元素
int view(stack_tt* stack)
{if(stack==NULL||isnull_stack(stack))
        return -1;

    printf("%3d",stack->data[stack->top]);
    return 0;
}
// 长度
int length_stack(stack_tt* stack)
{if(stack==NULL||isnull_stack(stack))
        return 0;

    return stack->top+1;
}

// 清空
int clear_stack(stack_tt* stack)
{if(stack==NULL)
        return -1;
    
    stack->top=-1;
    return 0;
}
// 销毁
int destroy_stack(stack_tt* stack)
{if(stack==NULL)
        return -1;

    free(stack->data);
    free(stack);

    return 0;
}

// 打印(真)int print_stack_real(stack_tt* stack)
{if(stack==NULL||isnull_stack(stack))
        return -1;

    stack_tt* temp=create_stack(length_stack(stack));

    int data;
    while(!isnull_stack(stack))
    {view(stack);
        pop_stack(stack,&data);
        push_stack(temp,data);
    }

    printf("\n");

    while(!isnull_stack(temp))
    {pop_stack(temp,&data);
        push_stack(stack,data);
    }

    destroy_stack(temp);
    return 0;
}
// 逆打印(真)int reprint_stack_real(stack_tt* stack)
{if(stack==NULL||isnull_stack(stack))
        return -1;

    stack_tt* temp=create_stack(length_stack(stack));

    int data;
    while(!isnull_stack(stack))
    {//    view(stack);
        pop_stack(stack,&data);
        push_stack(temp,data);
    }

//    printf("\n");

    while(!isnull_stack(temp))
    {view(temp);
        pop_stack(temp,&data);
        push_stack(stack,data);
    }
    printf("\n");

    destroy_stack(temp);
    return 0;
}



int main(int argc, const char *argv[])
{stack_tt* stack=create_stack(20);

    int i;

    for(i=1;i<=20;i++)
    {push_stack(stack,i*3);
        print_stack_notreal(stack);
    }

    reprint_stack_real(stack);
    print_stack_real(stack);
    print_stack_notreal(stack);

#if 0
    int data;
    for(i=1;i<=20;i++)
    {pop_stack(stack,&data);
        printf("pop data:%d\n",data);
        print_stack_notreal(stack);
    }
#endif

    return 0;
}
退出移动版