堆栈——链栈的创建、入栈、出栈

顺序栈的创建、入栈、出栈:

堆栈——顺序栈的创建、入栈、出栈_f-f-g的博客-CSDN博客

//堆栈的链式存储

//带头结点的链栈

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

typedef int ElementType;
typedef  struct SNode * PtrToSNode;
struct SNode{
    ElementType Data;//结点元素 
    PtrToSNode Next;//指向下一结点 
};
typedef PtrToSNode Stack; 

//1.创建 
Stack CreateStack()
{
    //构建一个堆栈的头结点,返回该结点指针
    Stack S;
    S=(Stack)malloc(sizeof(struct SNode));
    S->Next =NULL;
    return S;
}

//2.入栈Push
/*
链栈通常不会出现满栈的情况
链栈以链表方式储存信息 而链表的节点一般都是以动态分配内存
这样 如果在没有其他限制情况下 只有动态申请内存失败的时候才算是栈满 
*/ 
bool Push(Stack S,ElementType X)
{
    PtrToSNode TmpCell;
    
    TmpCell=(PtrToSNode)malloc(sizeof(struct SNode));
    TmpCell->Data =X;
    //插入头结点后(带头结点) 
    TmpCell->Next =S->Next ;
    S->Next =TmpCell;
    return true; 
}


//3.出栈Pop 

//判断堆栈是否为空
bool IsEmpty(Stack S)
{
    //为空则返回true 
    return (S->Next ==NULL);
 } 
 
#define ERROR -1 //ERROR为链栈不可能取到的值 
ElementType Pop(Stack S)
{
    //删除并返回堆栈S的栈顶元素
    PtrToSNode FirstCell;
    ElementType TopElem;
    if(IsEmpty(S)){
        printf("堆栈空\n");
        return ERROR;
    }else{
        FirstCell=S->Next ;
        TopElem=FirstCell->Data ;
        S->Next =FirstCell->Next ;
        free(FirstCell);
        return TopElem;
    }
 } 
 
 
 
int main()
{
    Stack S=CreateStack(); 
    int i;
    //输入数据
    printf("请输入链表结点个数:\n");
    int n;
    scanf("%d",&n);
    
    ElementType X,p;
    printf("入栈:");
    for(i=0;i<n;i++){
        scanf("%d",&X);
        Push(S,X);
    }
    printf("\n");
    
    printf("出栈: "); 
    for(i=0;i<n;i++){
        p=Pop(S);
        printf("%d ",p);
    }
    return 0;
}


运行:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值