/*
    栈:
    1、什么叫栈:栈就是一个存储结构,简单的说就是一种存储的方式
    2、栈是怎么存储的:栈是先进后出的一种存储结构,类似于箱子
    3、栈的分类:静态栈、动态栈。
    4、什么叫静态栈:类似于数组往箱子里放
    5、什么叫动态栈:类似于链表往箱子里放
    6、栈的应用有哪些:迷宫,表达式的计算,函数的调用,中断等,应用相当的广泛
    7、栈的操作步骤:初始化,压栈,出栈
    注:栈是静态内存存储,比如说,定义的变量,这是系统自动分配的。堆是动态存储结构,是程序员分配的
        比如说malloc(sizeof(4))
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef struct node
{
    int data;
    struct node * pNext;
}Node,*pNode;

typedef struct stack
{
    pNode pTop;
    pNode pBottom;
}Stack,* pStack;

typedef int bool;
#define true 0
#define false 1

void init_stack(pStack);
bool is_empty(pStack);
bool push_stack(pStack, int);
bool pop_stack(pStack, int *);
bool clear_stack(pStack);
int main(void)
{
    Stack S;
    int val;
    init_stack(&S);
    puts("------------------------------初始化栈是否为空-------------------------------");
    if( is_empty(&S) )
        printf("栈不为空!\n");
    else
        printf("栈为空!\n");
    push_stack(&S, 23);
    push_stack(&S, 45);
    push_stack(&S, 19);
    puts("-------------------------------压栈之后是否为空------------------------------");
    if( is_empty(&S) )
        printf("栈不为空!\n");
    else
        printf("栈为空!\n");
    puts("-------------------------------压栈是否成功----------------------------------");
    if( push_stack(&S, 55) )
        printf("压栈失败!\n");
    else
        printf("压栈成功!\n");
    if( !pop_stack(&S, &val) )
        printf("出栈成功:");
    pop_stack(&S,&val);
    puts("---------------------------------把栈清空-----------------------------------");
    if( !clear_stack(&S) )
        puts("清栈成功!");
    pop_stack(&S,&val);
    return 0;
}
void init_stack(pStack pS)
{
    pNode pNew=(pNode)malloc(sizeof(Node));
    if(pNew==NULL)
    {
        printf("动态内存分配失败!");
        exit(-1);
    }
    pS->pTop=pNew;
    pS->pBottom=pS->pTop;
    pS->pBottom->pNext=NULL;    //等价于 pNew->pNext=NULL
    return;
}
bool is_empty(pStack pS)
{
    if(pS->pTop==pS->pBottom)
        return true;
    else
        return false;
}
bool push_stack(pStack pS, int val)
{
    pNode pNew=(pNode)malloc(sizeof(Node));
    if(pNew==NULL)
    {
        printf("动态内存分配失败!");
        exit(-1);
    }
    pNew->data=val;
    pNew->pNext=pS->pTop;
    pS->pTop=pNew;
    if(pS->pTop==pS->pBottom)
        return false;
    else
        return true;
}
bool pop_stack(pStack pS, int * pVal)
{
    pNode p=NULL;
        while( is_empty(pS) )
        {
            p=pS->pTop;
            *pVal=p->data;
            printf("%d\t",*pVal);
            pS->pTop=p->pNext;
            free(p);
        }
        putchar('\n');
        if( is_empty(pS) )
            return false;
        else
            return true;
}
bool clear_stack(pStack pS)
{
    while( pS->pTop != pS->pBottom )
    {
        pNode p=pS->pTop;
        pNode q=p->pNext;
        free(p);
        pS->pTop=q;
    }
    if(pS->pTop==pS->pBottom)
        return true;
    else
        return false;
}

 

posted @ 2016-11-30 15:20  feng_kui  阅读(206)  评论(0编辑  收藏  举报