zoukankan      html  css  js  c++  java
  • 栈的链接存储


    #include<stdio.h>
    #include<malloc.h>
    #include<windows.h>
    #include<stdbool.h>
    
    #define SIZE 5                                     //定义默认数组长度
    #define len sizeof(struct stacknode)             //结构体stacknode的长度,即要申请空间的长度
    
    int sourceData[SIZE] = { 11,22,33,44,55 };         //内部数据数组,节省每次建立时输入时间
    enum returninfo { success, fail, underflow, range_error };  //定义返回信息清单
    int stackLength;                                 //链栈中数据个数
    bool flag = false;
    typedef struct stacknode {                         //用结构体定义链表的节点
        int data;
        struct stacknode* next;
    }NODE,*PNODE;
    
    typedef struct pointer {
        struct stacknode* linkStackTop;
        struct stacknode* newnodep;
        struct satcknode* usedNodep;
    };
    
    struct pointer* sp;
    //函数声明
    bool isempty();                                    //判断栈是否为空
    enum returninfo display();                        //显示栈中所有元素
    int getLength();                                //获取栈的长度
    void processmenu();                                //判断选择
    enum returninfo pop(int* item);                    //出栈,把数据返回
    void showmenu();                                //显示菜单
    enum returninfo initStack();                    //初始化链栈
    enum returninfo create();                        //根据内部默认数组创建一个栈
    enum returninfo destroy();                        //销毁一个栈
    enum returninfo push(int item);                 //将数据进栈
    enum returninfo poponly();                        //出栈,不返回数值,并且释放房前元素的空间
    enum returninfo gettop(int* item);                //得到栈顶元素
    void clearscreen();                                //清屏
    
    /*------------------------------------
    函数名:clearscreen()
    描  述:清屏
    入口参数:无
    出口参数:无
    --------------------------------------*/
    void clearscreen() {
        system("cls");
    }
    
    /*------------------------------------
    函数名:showmenu()
    描  述:显示菜单
    入口参数:无
    出口参数:无
    --------------------------------------*/
    void showmenu() {
        puts("=============================================    ");
        puts("栈的简单操作 ");
        puts("=============================================    ");
        puts("                   ★功能菜单★                    ");
        puts("=============================================    ");
        puts("1.初始化一个栈                                    ");
        puts("2.按照内部数组创建默认链栈                        ");
        puts("3.销毁一个栈                                    ");
        puts("4.出栈并且返回原栈顶的值                        ");
        puts("5.取出当前栈顶元素                                ");
        puts("6.遍历栈中所有数据                                ");
        puts("7.数据进栈                                        ");
        puts("8.获取栈的长度                                    ");
        puts("0.结束程序                                        ");
        puts("=============================================    ");
        printf("请输入您的选择:");
    }
    
    /*------------------------------------
    函数名:initStack()
    描  述:初始化一个栈
    入口参数:无
    出口参数:enum returninfo类型判断是否成功
    --------------------------------------*/
    enum returninfo initStack() {
        sp = (struct pointer*)malloc(sizeof(struct pointer));
        sp->linkStackTop = (PNODE)malloc(len);
        if (sp->linkStackTop == NULL) {
            return fail;
        }
        sp->linkStackTop->next = NULL;
        stackLength = 0;
        return success;
    }
    
    /*------------------------------------
    函数名:create()
    描  述:创建一个链栈
    入口参数:无
    出口参数:enum returninfo类型判断是否成功
    --------------------------------------*/
    enum returninfo create() {
        int i;
        for (i = 0; i < SIZE; i++) {
            sp->newnodep = (PNODE)malloc(len);
            if (sp->newnodep == NULL) {
                return fail;
            }
            sp->newnodep->data = sourceData[i];
            sp->newnodep->next = sp->linkStackTop->next;
            sp->linkStackTop->next = sp->newnodep;
            stackLength++;
        }
        return success;
    }
    
    /*------------------------------------
    函数名:destroy()
    描  述:销毁一个链栈
    入口参数:无
    出口参数:enum returninfo类型判断是否成功
    --------------------------------------*/
    enum returninfo destroy() {
        if (poponly() == underflow) {
            return underflow;
        }
        while (poponly() == success);
        return success;
    }
    
    /*------------------------------------
    函数名:poponly()
    描  述:出栈但不返回数据
    入口参数:无
    出口参数:enum returninfo类型判断是否成功
    --------------------------------------*/
    enum returninfo poponly(){
        if (isempty() == false) {
            sp->usedNodep = sp->linkStackTop->next;
            sp->linkStackTop->next = sp->linkStackTop->next->next;
            free(sp->usedNodep);
            stackLength--;
            return success;
        }
        return underflow;
    }
    
    /*------------------------------------
    函数名:isempty()
    描  述:判断栈是否为空
    入口参数:无
    出口参数:返回栈是否为空的信息
    --------------------------------------*/
    bool isempty() {
        if (stackLength == 0) {
            return true;
        }
        else {
            return false;
        }
    }
    
    /*------------------------------------
    函数名:pop()
    描  述:出栈返回数据
    入口参数:通过引用的到栈顶的值
    出口参数:enum returninfo类型判断是否成功
    --------------------------------------*/
    enum returninfo pop(int* item) {
        if (isempty()) {
            return underflow;
        }
        *item = sp->linkStackTop->next->data;
        sp->usedNodep = sp->linkStackTop->next;
        sp->linkStackTop->next = sp->linkStackTop->next->next;
        free(sp->usedNodep);
        stackLength--;
        return success;
        
    }
    
    /*------------------------------------
    函数名:gettop()
    描  述:返回数据
    入口参数:通过引用的到栈顶的值
    出口参数:enum returninfo类型判断是否成功
    --------------------------------------*/
    enum returninfo gettop(int* item) {
        if (isempty()) {
            return underflow;
        }
        *item = sp->linkStackTop->next->data;
        return success;
    }
    
    /*------------------------------------
    函数名:getdisplay()
    描  述:遍历栈中元素
    入口参数:通过引用的到栈的所有数据
    出口参数:enum returninfo类型判断是否成功
    --------------------------------------*/
    enum returninfo display() {
        PNODE searchp = sp->linkStackTop->next;
        if (isempty()) {
            return underflow;
        }
        printf("目前栈中的内容是:栈顶-->");
        while (searchp) {
            printf("%d ",searchp->data);
            searchp = searchp->next;
        }
        printf("栈底
    ");
        return success;
    }
    
    /*------------------------------------
    函数名:push()
    描  述:数据进栈
    入口参数:要进栈的元素数值
    出口参数:enum returninfo类型判断是否成功
    --------------------------------------*/
    enum returninfo push(int item) {
        sp->newnodep = (PNODE)malloc(len);
        if (sp->newnodep == NULL) {
            return fail;
        }
        sp->newnodep->data = item;
        sp->newnodep->next = sp->linkStackTop->next;
        sp->linkStackTop->next = sp->newnodep;
        stackLength++;
        return success;
    
    }
    
    /*------------------------------------
    函数名:getLength()
    描  述:得到栈的长度
    入口参数:无
    出口参数:int型表示栈的长度
    --------------------------------------*/
    int getLength() {
        return stackLength;
    }
    
    /*------------------------------------
    函数名:processmenu()
    描  述:判断选择,完成功能
    入口参数:struct pointer* 类型
    出口参数:无
    --------------------------------------*/
    void processmenu() {
        int menuchoice;
        int num1;
        int returnvalue;
        scanf("%d", &menuchoice);
        switch (menuchoice) {
        case 1:
            returnvalue = initStack();
            if (returnvalue == fail) {
                printf("链栈初始化失败!
    ");
            }
            else {
                printf("链栈初始化成功!
    ");
            }
            break;
        case 2:
            returnvalue = create();
            if (returnvalue == fail) {
                printf("内存分配失败,创建失败!
    ");
            }
            else {
                printf("链栈创建成功!
    ");
            }
            break;
        case 3:
            returnvalue = destroy();
            if (returnvalue == underflow) {
                printf("栈为空!
    ");
            }
            else {
                printf("栈销毁成功!
    ");
            }
            break;
        case 4:
            returnvalue = pop(&num1);
            if (returnvalue == underflow) {
                printf("链栈为空!
    ");
            }
            else {
                printf("出栈成功,栈顶值为%d
    ",num1);
            }
            break;
        case 5:
            returnvalue = gettop(&num1);
            if (returnvalue == underflow) {
                printf("栈链为空!
    ");
            }
            else {
                printf("取出栈顶元素为%d
    ",num1);
            }
            break;
        case 6:
            returnvalue = display();
            if (returnvalue == underflow) {
                printf("链表为空!
    ");
            }
            break;
        case 7:
            printf("请输入您要入栈的元素值: ");
            scanf("%d",&num1);
            returnvalue = push(num1);
            if (returnvalue == fail) {
                printf("分配内存失败!
    ");
            }
            else {
                printf("数据入栈成功!");
            }
            break;
        case 8:
            num1 = getLength();
            printf("栈的长度为%d
    ",num1);
            break;
        case 0:
            exit(0);
        default :
            puts("对不起,您输入的功能编号有错!请重新输入!!!");
            break;
        }
    }
    
    
    //主函数
    int main()
    {
        SetConsoleTitle("栈元素的简单操作");
        system("color f0");                  //设置背景为白色,字体为黑色
        clearscreen();
        
        while (true) {
            showmenu();                        //显示菜单
            processmenu();                    //处理菜单窗口,出口就在其中
            system("pause");                //暂停一下,等用户给一个回车
            clearscreen();
        }
        return 0;
    }
  • 相关阅读:
    AJAX 三级联动
    AJAX JSON类型返回
    AJAX 汽车详细信息练习
    JQ AJAX
    对话框关联两个Layout时
    删除,拨打电话,发送短信对话框
    自定义对话框,时间日期对话框
    一般对话框,单选复选对话框
    JAVA。String转Int
    加监听器,单选复选按钮
  • 原文地址:https://www.cnblogs.com/WineinSeptember/p/12791280.html
Copyright © 2011-2022 走看看