链栈的练习

链栈练习

相关内容:栈的链式存储结构(链栈)

//链栈的初始化、判空、入栈、出栈、读取栈顶元素
//链栈的结点:数据域、指针域
#include<stdio.h>
#include<stdlib.h>
typedef int Status;
#define OK 1
#define ERROR 0
typedef struct LNode
{
    
    
    int data;
    struct LNode *next;
}LinkNode,*LinkStack;
//链栈的初始化
Status InitLinkStack(LinkStack *LS){
    
    
    (*LS)=NULL;//栈顶指针置空
    return OK;
}
//链栈的判空
Status isEmpty(LinkStack *LS){
    
    
    if ((*LS)==NULL)
    {
    
    
        return ERROR;
    }else
        return OK;
}
//链栈的入栈,由于出入栈只能在表头操作
//使用栈顶指针需要改变,使用指针的指针保存栈顶指针,方便修改其指向
Status Push(LinkStack *LS,int e){
    
    
    //无需判满,只有内存不满都可申请空间
    LinkNode *p;//新结点p
    p=(LinkNode*)malloc(sizeof(LinkNode));
    p->data=e;//元素赋值给结点数据域
    p->next=(*LS);//新结点指向表头
    (*LS)=p;//栈顶指针指向新结点使其成为新表的表头
    return OK;
}
//链栈的出栈,由于出入栈只能在表头操作
//使用栈顶指针需要改变,使用指针的指针保存栈顶指针,方便修改其指向
Status Pop(LinkStack *LS,int *e){
    
    
    if ((*LS)==NULL)//判空
        return ERROR;
    *e=(*LS)->data;//把表头结点数据取走
    LinkNode *p;
    p=(*LS);//p指向表头结点,一会删除
    (*LS)=(*LS)->next;//后移栈顶指针,指向新表头结点
    free(p);//删除当前表头结点p
    return OK;
}
//链栈的读取栈顶元素
int GetElem(LinkStack *LS){
    
    
    if ((*LS)!=NULL)
        return (*LS)->data;
    else
        return 0;
}
int main(){
    
    
    int n,e;
    LinkStack LS;
    InitLinkStack(&LS);
    printf("初始化完成!\n");
    if (!isEmpty(&LS))
        printf("栈空!\n");
    printf("输入需要入栈的元素个数:");
    scanf("%d",&n);
    for (size_t i = 0; i < n; i++)
    {
    
    
        printf("输入第%d个入栈元素:",i+1);
        scanf("%d",&e);
        Push(&LS,e);
    }
    printf("栈顶元素为:%d\n",GetElem(&LS));
    printf("所有元素出栈\n");
    for (size_t i = 0; i < n; i++)
    {
    
    
        printf("输出第%d个出栈元素:",i+1);
        Pop(&LS,&e);
        printf("%d\n",e);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_48524215/article/details/134221214
今日推荐