栈的链式实现

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int Elemtype;
typedef struct StackNode{
Elemtype data;
struct StackNode *next;
}StackNode;
typedef struct{
  struct StackNode *top;//栈顶指针,必须有 struct 才可以

}LinkStack;
/*初始化链栈*/
void InitStack(LinkStack *s)
{
    s->top=NULL;
    printf("\n已经成功初始化链栈!\n");

}

/*链栈置空*/
void setEmpty(LinkStack *s)
{
    s->top=NULL;
    printf("\n链栈已经置空!\n");

}
void pushLstack(LinkStack *s,Elemtype x)
{
    StackNode *p;
    p=(StackNode *)malloc(sizeof(StackNode));//建立结点
    p->data=x;
    p->next=s->top;
    s->top=p;

}
Elemtype popLstack(LinkStack *s)
{
    Elemtype x;
    StackNode *p;
    p=s->top;
    if(s->top==0)
    {
        printf("\n栈空,不能出栈!\n");
        return 0;
    }
    x=p->data; printf("\n当前数据为:%d\n",x);
    s->top=p->next;//当前的栈顶指向原栈的next
    free(p);
    return x;

}
Elemtype StackTop(LinkStack *s)
{
    Elemtype x;
    if(s->top==0)
    {
        printf("\n链栈空\n");
        return 0;
    }
    {
        x=s->top->data;printf("\n\n当前链栈的栈顶元素为:%d\n",x); return x;
    }
}
/*遍历*/
void Disp(LinkStack *s)
{
    printf("\n链栈中的数据为:\n");
    printf("==================================\n");
    StackNode *p;
    p=s->top;
    while(p!=NULL)
    {
        printf("%d\n",p->data);
        p=p->next;
    }
    printf("===================================\n");
}
void main()
{
    int i,n,a;//int m;
    LinkStack *s;
    s=(LinkStack *)malloc(sizeof(LinkStack));
    int cord;
    printf("第一次使用必须初始化!\n");
    do
    {
        printf("\n");
        printf("\n");
        printf("\n=============主菜单============\n");
        printf("\n       1  初始化链表           \n");
        printf("\n       2  入栈                 \n");
        printf("\n       3  出栈                 \n");
        printf("\n       4  取栈顶元素           \n");
        printf("\n       5  置空链栈             \n");
        printf("\n       6  结束 程序            \n");
        printf("\n===============================\n");
        printf("请你输入您的选择(1,2,3,4,5,6)");
        scanf("%d",&cord);
        printf("\n");
        switch(cord)
        {
            case 1:{
                    InitStack(s);
                    Disp(s);}break;
            case 2:{
                    printf("输入将要压入链栈的数据个数:n=");
                    scanf("%d",&n);
                    printf("依次将%d个数据压入链栈:\n",n);
                    for(i=1;i<=n;i++)
                    { scanf("%d",&a);
                    pushLstack(s,a);
                    }
                    Disp(s);
                  }break;
            case 3:{
                    //printf("\n出栈操作开始!\n");
                    //printf("输入将要出栈的数据个数:m=");
                    //scanf("%d",&m);
                   // for(i=1;i<=m;i++)
                   // {
                      //  printf("\n\n第%d次出栈的数据是:%d",i,popLstack(s));
                   // }
                    popLstack(s); Disp(s);
                    }break;
            case 4:{
                    //printf("\n\n链栈的栈顶元素为:%d\n",StackTop(s));
                     StackTop(s);printf("\n");
                       }break;
            case 5:{
                    setEmpty(s);
                    Disp(s);
                    }break;
            case 6:exit(0);
        }
    }while(cord<=6);


}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无休居士

感谢您的支持,我会继续努!

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

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

打赏作者

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

抵扣说明:

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

余额充值