总共有六个文件,两个头文件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,帅逼 ,在此感谢中央电视台,感谢
我本来可以靠脸吃饭的数据结构老师却靠技术吃饭。
作者微信账户暂无,
打赏账户:现金支付(线上支付要手续费),如遇困难一律缴费解决!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)