数据结构第二版,链栈的实现(c语言版)(初始化,入栈,出栈,取栈顶元素)

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

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int ElemType;
typedef int Status;

//链栈储存结构 
typedef struct StackNode
{
    ElemType data;
    struct StackNode *next;   //指向下一个同类型结点 
}StackNode,*LinkStack;

//初始化
Status InitStack(LinkStack *S)
{
    *S = NULL;   //头指针置空 
    return OK;
}

//入栈
Status push(LinkStack *S,ElemType e)
{
    StackNode *p;   //开辟新结点 
    p = (StackNode *)malloc(sizeof(StackNode));
    p->data = e;    //元素赋值 
    p->next = *S;  //压栈(结点连接) 
    *S = p;   //头指针指向栈顶(指向新结点) 
    return OK;
}

//出栈
Status pop(LinkStack *S,ElemType *e)
{
    if(*S == NULL) return ERROR;   //空栈 
    StackNode *p;    //临时指针 
    *e = (*S)->data;     //数据出栈 
    p = *S;     //临时指针 
    *S = (*S)->next;  //栈顶指针指向上一个元素 
    free(p);   //释放临时指针指向的栈顶空间 
    return OK;
}

//判断链栈是否为空
int isEmpty(LinkStack S)
{
    if(S == NULL) return TRUE;   //指向栈顶的指针为空 
    return FALSE;
}

//遍历
void showElems(LinkStack S)
{    LinkStack p;
    p=S;
    while(p!=NULL){
    printf("%d ",p->data); 
    p=p->next;
    }
 
}

//清空链栈 
Status clearStack(LinkStack *S)
{
    if(*S == NULL) return ERROR;
    ElemType e;
    while(*S != NULL)
        pop(S,&e);
    free(&e);
    return OK;
}
//取栈顶元素
int GetTop(LinkStack S){
    if(S!=NULL)
    S->data;
    return OK;

int main()
{     int i,n,e;
    LinkStack S;

    printf("已初始化链栈\n");
    InitStack(&S);
    
     printf("入栈n个元素,输入n:") ;
    scanf("%d",&n);
    for(i=0;i<n;i++){
    scanf("%d",&e);
    push(&S,e);
    }
    
    printf("\n链栈是否为空?\n");
    printf("当前链栈情况:"); 
    if(isEmpty(S)) printf("空栈\n");
    else printf("非空栈\n");
    
    printf("\n遍历栈内元素\n");
    showElems(S); 
    printf("\n");
        
        //栈顶元素
    printf("取栈顶元素:");
    // if(GetTop(S)){
    //printf("%d\n",e);
    //}    
     GetTop(S);
     printf("%d",e);
    
    printf("\n\n清空链栈\n");
    clearStack(&S);
    
    printf("当前链栈情况:"); 
    if(isEmpty(S)) printf("空栈\n");
    else printf("非空栈\n");
    
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安和桥985

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值