【数据结构】 栈

栈,后进先出,两步骤:

1.PUSH,对栈进行insert操作,PUSH多了则上溢

2.POP,无参数的对栈进行delete操作,POP空栈则下溢

实现按链表形式实现,具体问题与队列类似,插入、查找、删除则类似链表。

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

typedef int ElemType;

///

//定义链栈的结构类型

typedef struct StackNode 
{
    ElemType data;                //栈的数据 
    struct StackNode *next;        //指针域 
} StackNode,*LinkStack;

//

//链栈的初始化

LinkStack LinkStackInit()
{
    LinkStack top;                    //构造一个空栈 
    top = (StackNode *)malloc(sizeof(StackNode));
    if(!top)
        printf("OVERFLOW\n");
    top = NULL;
    return top; 
}

/

//判断栈空的算法

int LinkStackEmpty(LinkStack top)
{
    if(!top)
        return 1;
    else 
        return 0;
}



//进栈
LinkStack LinkStackPush(LinkStack top,ElemType x)
{
    LinkStack p;
    p = (StackNode *)malloc(sizeof(StackNode));    //创建一个结点 
    p->data = x;                                //设置结点的数据域 
    p->next = top;                                 //设置结点的指针域
    top = p;                                    //设置新的栈顶 
    return top;
}



//出栈
ElemType LinkStackPop(LinkStack &top)//出栈的时候必须判断是否栈空 
{
    LinkStack p;
    ElemType x;
        
    if(top != NULL)
    {
        x = top->data;                        //取栈顶元素 
        p = top;                            //将栈顶结点重置 
        top = top->next;
        free(p);                            //释放原栈顶结点空间 
    }
    else
        printf("stack empty!\n");
    return  x;
} 
int main()
{
    LinkStack lstack;
    lstack = LinkStackInit();
    ElemType x;
    printf("请输入进栈的元素:");
    while(scanf("%d",&x) != EOF)
    {
        lstack = LinkStackPush(lstack,x); 
    }
    LinkStack p;
    for(p = lstack;p != NULL; p = p->next)
        printf("%d ",p->data);
    printf("出栈的结果为:");
    while(lstack != NULL)
        printf("%d ",LinkStackPop(lstack));
    return 0;
} 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值