栈的程序演示

# include <stdio.h>
# include <stdlib.h>


typedef struct Node
{
    int data;
    struct Node *next;
}NODE, * PNODE;


typedef struct Stack
{
    PNODE pTop;
    PNODE pBottom;
}STACK, * PSTACK;


void init (PSTACK pS)//PSTACK 等价于 struck STACK *
{
    pS ->pTop = (PNODE) malloc (sizeof (NODE));
    if (NULL == pS ->pTop)
    {
        printf("wrong!\n");
        exit(-1);
    }
    else
    {
        pS ->pBottom = pS ->pTop;
        pS ->pBottom -> next = NULL;//pS ->pTOP -> next = NULL
        printf("Success!\n");
    }
}


void push (PSTACK pS, int val)
{
    PNODE pNew = (PNODE) malloc (sizeof (NODE));
    
    pNew ->data = val;
    pNew ->next = pS ->pTop;
    pS ->pTop = pNew;


    return ;
}


void traverse(PSTACK pS)
{
    PNODE p = pS ->pTop;


    while (p != pS ->pBottom)
    {
        printf("%d ",p ->data);
        p = p ->next;
    }
    printf("\n");
    return ;
}


bool empty(PSTACK pS)
{
    if (pS ->pTop == pS ->pBottom)
        return true;
    else
        return false;
}


//把pS所指向的栈出栈一次,并把出栈元素存在pVal形参所指向的变量中,如果出栈失败返回false,否则返回true
bool pop(PSTACK pS, int * pVal)
{
    if ( empty(pS) )//pS本身存放的就是S的地址
    {
        return false;
    }
    else
    {
         PNODE r = pS ->pTop;
         *pVal = r ->data;
         pS ->pTop = r ->next;
         free(r);
         r = NULL;


         return true;
    }
}


//clear清空
void clear(PSTACK pS)
{
    if (empty(pS))
    {
        return ;
    }
    else
    {
        PNODE p = pS ->pTop;
        PNODE q = NULL;


        while (p != pS ->pBottom)
        {
            q = p ->next;
            free(p);
            p = q;
        }
    }
    pS ->pTop = pS ->pBottom;
}
int main()
{
    STACK S;//STACK 等价于 struct Stack
    int val;
    init(&S);//目的是造出一个空栈
    push(&S,1);//压栈
    push(&S,2);
    push(&S,3);
    push(&S,4);
    push(&S,5);
    
    traverse(&S);//遍历输出


    //出栈
    if ( pop(&S,&val))
    {
        printf("Success!");
        printf("Pop is %d\n",val);
    }
    else
    {
        printf("Lose!\n");
    }


    traverse(&S);//遍历输出
    clear(&S);
    traverse(&S);


    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值