数据结构作业 栈的操作

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

#define OK    1
#define ERROR -1
#define MAXSIZE 10
typedef int Status;
typedef struct Node{
    int data;          //结点的数据域
    struct Node *next;//结点的指针域
    int stacksize;
}Node,*LinkList;
int i=0;//记录栈中数据个数


void ShowMenu()
{
    printf("\n");
    printf("\n****************链栈基本操作****************\n\n");
    printf("\t\t1  数据入栈\n");
    printf("\t\t2  数据出栈\n");
    printf("\t\t3  读取栈顶元素\n");
    printf("\t\t4  遍历输出栈中所有元素\n");
    printf("\t\t5  清除栈中数据\n");
    printf("\t\t6  判断是否栈空\n");
    printf("\t\t7  判断是否栈满\n");
    printf("\t\t8  销毁当前栈\n");
    printf("\t\t9  清空当前栈\n");
    printf("\t\t0  退出系统\n");
    printf("\n****************链栈基本操作****************\n\n");
    printf("\n");

}
//功能:带表头的链栈初始化
Status Init_Stack(LinkList &S)
{
    S = (LinkList)malloc(sizeof(Node));
    if(!S)
        return ERROR;
    S->next = NULL;
    Node Node3;
    Node3.stacksize=MAXSIZE;
    return OK;
}
//功能:入栈操作
Status Push_Stack(LinkList &S,int e)
{
    if(i<10)
    {
        LinkList p = (LinkList)malloc(sizeof(Node));
        if(!p)
            return ERROR;
        p->data = e;
        p->next = S->next;
        S->next = p;
        i++;
        return OK;
    }
    else printf("当前栈已满,别输入了!");
    return NULL;
}

//功能:出栈操作
Status Pop_Stack(LinkList &S)
{
    LinkList p = S->next;
    if(!p)
        return ERROR;
    S->next = p->next;
    free(p);
    i--;
    return OK;
}


//功能:取栈顶元素
int Top_Stack(LinkList S)
{
    LinkList p = S->next;
    if(!p)
        return ERROR;
    return p->data;
}

//功能:输出栈中所有元素
Status All_Stack(LinkList S)
{
    int a = 0;
    LinkList p = S->next;
    if(!p)
        return ERROR;
    while(p)
    {
        printf("第%d个元素为:%d\n",++a,p->data);
        p = p->next;
    }
    return OK;
}

//清空栈
Status Clear_Stack(LinkList &S)
{
    LinkList p = S->next;
    if(!p)
        return ERROR;
    while(p)
    {
        LinkList q = p;
        p = p->next;
        free(q);
    }
    //
    S->next = NULL;
    i=0;
    return OK;
}
//栈满判断
void full_Stack()
{
    if(i==10) printf("当前栈已满!");
    else printf("当前栈不满!");
}
//栈空判断 不用写函数
//销毁栈
void Destory_Stack(LinkList &S)
{
    if(!S) printf("没有栈可销毁!");
    else
    {
        free(S);
        S=NULL;
        printf("当前栈已销毁!");
    }
}
int main()
{
    int num;
    LinkList S;
    int choice;
    if(Init_Stack(S) ==ERROR)
        exit(0);
    while(1)
    {
        ShowMenu();
        printf("Which is your choice:");
        scanf("%d",&choice);
        switch(choice)
        {
        case 1:
            printf("请输入入栈元素:\n");
            scanf("%d",&num);
            if(Push_Stack(S,num)==OK)
                printf("数据入栈成功!\n");
            getchar();getchar();
            system("cls");
            break;


        case 2:
            if(Pop_Stack(S)==ERROR)
                printf("栈空,无法出栈!\n");
            else
                printf("出栈成功!\n");
            getchar();getchar();
            system("cls");
            break;

        case 3:
            if(Top_Stack(S)==ERROR)
                printf("栈空,无法访问栈顶元素!\n");
            else
                printf("栈顶元素为:%d\n",Top_Stack(S));
            getchar();getchar();
            system("cls");
            break;

        case 4:
            if(All_Stack(S)==ERROR)
                printf("栈空,无法输出栈中元素!\n");
            else
                printf("输出成功!\n");
            getchar();getchar();
            system("cls");
            break;


        case 5:
            if(Clear_Stack(S)==ERROR)
                printf("栈已经为空,不用再次清空!\n");
            else
                printf("栈元素清空成功!\n");
            getchar();getchar();
            system("cls");
            break;

        case 0:
            printf("退出成功!\n");
            exit(0);

        case 6:
            if(Pop_Stack(S)==ERROR) printf("当前栈空!");
            else printf("当前栈不空!");
            getchar();getchar();
            system("cls");
            break;

        case 7:
            full_Stack();
            getchar();getchar();
            system("cls");
            break;
        case 8:
            Destory_Stack(S);
            getchar();getchar();
            system("cls");
            break;
        case 9:
            if(Clear_Stack(S)==OK) printf("当前栈已清空!");
            else printf("当前栈已为空栈!");
            getchar();getchar();
            system("cls");
            break;
        default:
            printf("输入错误,请重新输入!\n");
            getchar();getchar();
            system("cls");
        }

    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值