C语言数据结构顺序堆栈 *** 作功能vs2022完美运行

C语言数据结构顺序堆栈 *** 作功能vs2022完美运行,第1张

总共有六个文件,两个头文件base.h、stack.h,三个源文件main.c、stack.c、base.c,一个cfg后缀名的资源文本文件base.cfg,因为这个是vs2022的,base.c和base.h是打开base.cfg文件用的

有个头文件#define _CRT_SECURE_NO_WARNINGS 1  ,如果用其他的编译器运行,请把这个删除

创建cfg文件方法:

右键你的项目,我的是Project12

选择添加新建项

在左边的Visual C++下面的选项点实用工具,然后中间黑色窗口选择文本文档,下面有个名称,在填写名称的时候,把后缀名txt改为cfg即可

main.c源文件的代码:

#define _CRT_SECURE_NO_WARNINGS 1

#include
#include "stack.h"
#include "base.h"

#define MSIZE 100 /*顺序栈的最长长度*/


int main(int argc, char* argv[])
{
    int cmd;
    Stack S;
    char op;
    ElemType x;
    int y;

    welcome();/*欢迎logo*/
    do
    {
        
        loadcfg();/*菜单*/
        cmd = command();/*接受选项*/

        switch (cmd)
        {
        case 1:    /*初始化*/
            if (Create(&S, MSIZE) == ERROR)
            {
                printf("栈初始化失败!\n");
                cmd = 0;
            }
            else
            {
                printf("栈初始化OK!\n");
            }
            break;

        case 2:    /*元素入栈*/
        {
            do
            {
                printf("请输入元素x:");
                scanf("%d", &x);
                if (Push(&S, x))
                {
                    printf("元素 %d 已入栈!\n", x);
                }
                else
                {
                    printf("入栈失败!\n");
                }
                printf("是否继续?(Y\\N,Y):");
                getchar();
                scanf("%c", &op);
                op = (op == 10) ? 'y' : op;
            } while (op == 'y' || op == 'Y');
        }
        break;

        case 3:    /*元素出栈*/
        {
            if (Pop(&S, &x))
            {
                printf("元素 %d 已出栈!\n", x);
            }
            else
            {
                printf("出栈失败!\n");
            }
        }
        break;

        case 4: /*判断顺序栈是否为空(IsEmpty)*/
        {
            if (IsEmpty(&S))
            {
                printf("顺序栈不为空!\n");
            }
            else
            {
                printf("顺序栈为空!\n");
            }
        }break;

        case 5:
        {
            if (IsFull(&S))
            {
                printf("顺序栈已满!\n");
            }
            else
            {
                printf("顺序栈未满!\n");
            }
        }break;
        case 6:    /*获取栈顶元素(Top)*/
        {
            
            if (Top(&S))
            {
                printf("栈顶元素为:%d\n", Top(&S));
            }
            else
            {
                printf("顺序栈没有元素!\n");
            }
        }break;

        case 7:    /*清除顺序栈全部元素(Clear)*/
        {
            if (Clear(&S))
            {
                printf("清除完毕!\n");
            }
        }break;

        case 8:    /*释放空间(Destroy)*/
        {
            if (Destroy(&S))
            {
                printf("空间释放完毕!\n");
            }
        }break;

        case 9:
            aboutme();
            break;

        case 0:
            printf("感谢使用!\n");
            break;
        default:
            printf("未开发:%d选项!\n", cmd);
            break;
        }

    } while (cmd);
    return 0;
}

stack.c源文件的代码:

#define _CRT_SECURE_NO_WARNINGS 1

/*

  stack.c

*/
#include
#include "stack.h"
#include


/*初始化*/
Status Create(Stack* S, int mSize)
{
    S->top = -1;
    S->maxsize = mSize;
    S->data = (ElemType*)malloc(sizeof(ElemType) * mSize);
    if (!S->data)
    {
        /*申请内存空间失败!*/
        return ERROR;
    }
    return OK;
}

/*入栈push*/
Status Push(Stack* S, ElemType x)
{
    if (S->top > S->maxsize - 1)
    {
        printf("栈已满!\n");
        return ERROR;
    }
    S->top += 1;
    S->data[S->top] = x;
    /*[S->top]*/
    return OK;
}

/*出栈pop*/
Status Pop(Stack* S, ElemType* x)
{
    /*判断栈是否为空*/
    if (S->top < 0)
    {
        printf("栈为空!\n");
        return ERROR;
    }
    *x = S->data[S->top];/*[S->top]*/
    S->top = S->top - 1;
    return OK;
}

/*判断顺序栈是否为空*/
Status IsEmpty(Stack* S)
{
    if (S->top == -1)
    {
        return ERROR;
    }
    return OK;
}

/*判断顺序栈是否已满*/
Status IsFull(Stack* S)
{
    if (S->top == S->maxsize - 1)
    {
        return OK;
    }
    return ERROR;
}

/*获取栈顶元素*/
Status Top(Stack* S)
{
    if (S->top == -1)
    {
        return ERROR;
    }
    return S->data[S->top];
}

/*清除顺序栈全部元素*/
Status Clear(Stack* S)
{
    if (S->top == -1)
    {
        printf("栈中无元素,无需清除!\n");
        return ERROR;
    }
    S->top = -1;
    return OK;
}

/*释放空间*/
Status Destroy(Stack* S)
{
    S->maxsize = 0;
    free(S->data);
    S->top = -1;
    return OK;
}

base.c源文件的代码:

#define _CRT_SECURE_NO_WARNINGS 1

/*

  base.c
*/
#include
#include "base.h"


int welcome()
{
    FILE* f;
    char    str[128];
    char* p;
    char    ch;
    int        i, j, k;
    int        line;

    /*打开文件,返回文件指针*/
    f = fopen("base.cfg", "r");

    if (!f)
    {
        printf("文件打开失败!\n");
        return 1;
    }

    line = 0;
    while (p = fgets(str, 128, f))
    {
        line++;

        /*printf("%s",str);*/
        k = 0;
        ch = str[k];
        while (ch != '\0')
        {
            printf("%c", ch);

            for (i = 0; i < 100; i++)
                for (j = 0; j < 900; j++)
                    ;
            ch = str[++k];
        }

        if (line > 10)
        {
            break;
        }
    }

    /*关闭文件*/
    fclose(f);
    return 0;

}
int loadcfg()/*加载菜单*/
{
    FILE* f;
    char  str[128];
    char* p;
    int      line;

    /*打开文件,返回文件指针*/
    f = fopen("base.cfg", "r");

    if (!f)
    {
        printf("文件打开失败!\n");
        return 1;
    }
    line = 0;
    while (p = fgets(str, 128, f))
    {
        line++;
        if (line < 11)
            continue;
        printf("%s", str);
        if (line > 24)
            break;
    }

    /*关闭文件*/
    fclose(f);
    return 0;
}

int command()/*接受选项*/
{
    int cmd;

    scanf("%d", &cmd);
    return cmd;
}

int aboutme()/*彩蛋*/
{
    FILE* f;
    char    str[300];
    char* p;
    int        line;

    /*打开文件,返回文件指针*/
    f = fopen("base.cfg", "r");

    if (!f)
    {
        printf("文件打开失败!\n");
        return 1;
    }
    line = 0;
    while (p = fgets(str, 128, f))
    {
        line++;
        if (line < 26)
            continue;
        printf("%s", str);

    }

    /*关闭文件*/
    fclose(f);
    return 0;
    return 0;
}

stack.h头文件的代码:

/*

  stack.h

*/
#define OK 1
#define ERROR 0

typedef int Status;
typedef int ElemType;

typedef struct stack
{
    int            top;        /*栈顶“指针"*/
    int            maxsize;    /*最大值*/
    ElemType* data;        /*”数组”,存放数据*/
}Stack;

/*初始化*/
Status Create(Stack* S, int mSize);

/*入栈push*/
Status Push(Stack* S, ElemType x);

/*出栈pop*/
Status Pop(Stack* S, ElemType* x);

/*判断顺序栈是否为空*/
Status IsEmpty(Stack* S);

/*判断顺序栈是否已满*/
Status IsFull(Stack* S);

/*获取栈顶元素*/
Status Top(Stack* S);

/*清除顺序栈全部元素*/
Status Clear(Stack* S);

/*释放空间*/
Status Destroy(Stack* S);

base.h头文件的代码:

/*

  base.h

*/

int welcome();  /*加载欢迎界面*/
int loadcfg();    /*加载菜单*/
int command();    /*获取选择命令*/
int aboutme();  /*彩蛋*/

base.cfg文件的代码:


    .---- -. -. .  .   .     , ,  ,   ,     ,  ,    , , ,,  , ,   , ,  
   ( .',----- - - ' '    , ,           ,   ,    ,
    \_/      ;--:-\                                 __--------------------__
   __U__n_^_''__[. |ooo___                         | |_!_||_!_||_!_||_!_| |
 c(_ ..(_ ..(_ ..( /,,,,,,]          Welcome!!!     | |___||___||___||___| |
 ,_\___________'_|,L______]______________________|______________________|
/;_(@)(@)==(@)(@)   (o)(o)                             (o)^(o)--(o)^(o)    


 
---------------顺序栈----------------
        1.初始化(Greate)
        2.入栈(Push)
        3.出栈(Pop)
        4.判断顺序栈是否为空(IsEmpty)
        5.判断顺序栈是否已满(IsFull)
        6.获取栈顶元素(Top)
        7.清除顺序栈全部元素(Clear)
        8.释放空间(Destroy)
        9.彩蛋(About us)
        ...(未开发)
        0.退出
    请选择(0~10,0):

本程序为栈的顺序存储,实现栈的初始化、入栈等10个 *** 作。



作者为 xxxxxxxx,帅逼 ,在此感谢中央电视台,感谢
我本来可以靠脸吃饭的数据结构老师却靠技术吃饭。


作者微信账户暂无,
打赏账户:现金支付(线上支付要手续费),如遇困难一律缴费解决!
 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/567954.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存