#define _CRT_SECURE_NO_WARNINGS//链栈
#include <stdio.h>
#include <malloc.h>
//全局定义特殊变量
#define ok 1
//转定义区域
typedef char SElemType;
typedef int status;
typedef struct StackNode//定义栈
{
SElemType data;
struct StackNode* next;
}StackNode,*LinkStack;
void Interrupt()//中断函数
{
while (1) //用于检测换行符,使函数脱离scanf的连续输出
if (getchar() == '\n')
break;
}
status InitStack(LinkStack&S)//链栈初始化
{
S = NULL;
return ok;
}
void Packfun1(LinkStack& S)
{
int i;
i = InitStack(S);
if (i = 1)
{
printf("初始化成功!");
}
else
{
printf("初始化失败!");
}
}
void StackEmpty(LinkStack S)//判断栈是否为空
{
if (S)
{
printf("非空栈\n");
}
else
{
printf("空栈\n");
}
}
status push(LinkStack &S, SElemType e)//入栈操作
{
StackNode* p;
p = (StackNode*)malloc(sizeof(StackNode));
p->data = e;
p->next = S;
S = p;
return ok;
}
void Packfun2(LinkStack& S)
{
int i;
SElemType e;
printf("请输入要入栈的值:");
Interrupt();
scanf("%c", &e);
i = push(S, e);
if (i = 1)
{
printf("入栈成功!");
}
else
{
printf("入栈失败!");
}
}
status pop(LinkStack& S, SElemType &e)//出栈的操作
{
StackNode* p;
if (!S)
{
return 0;
}
e = S->data;
p = S;
S = S->next;
free(p);
return ok;
}
void Packfun3(LinkStack& S)//一直出栈
{
SElemType e;
printf("出栈的顺序为:\n");
while (S)
{
pop(S, e);
printf("%c\n", e);
}
}
void DestroyStack(LinkStack& S)//销毁栈
{
StackNode* p = S;
while (S)
{
S = S->next;
free(p);
p = S;
}
free(S);
printf("栈已销毁!");
}
void StackTraverse(LinkStack& S)//输出所有栈的内容
{
StackEmpty(S);
StackNode* p = S;
while (!p)
{
printf("%c\n", p->data);
p = p->next;
}
}
int main()
{
int a, f = 0, i = 0;
LinkStack S=NULL;
while (1)
{
printf("\n");
printf("================================\n");
printf("| 链栈的操作系统 |\n");
printf("================================\n");
printf("| 1.初始化链栈 |\n");
printf("| 2.判断栈是否为空 |\n");
printf("| 3.进栈 |\n");
printf("| 4.持续出栈 |\n");
printf("| 5.释放栈 |\n");
printf("| 0.退出链栈操作系统 |\n");
printf("================================\n");
printf("请选择功能(0-5):");
mark:scanf("%d", &a);
switch (a)
{
case 0:f = 1; break;
case 1: Packfun1(S); break;
case 2: StackEmpty(S); break;
case 3: Packfun2(S); break;
case 4:Packfun3(S); break;
case 5: DestroyStack(S); break;
default:printf("选择功能错误!请重新选择菜单功能:"); goto mark;
}
if (f == 1)
{
printf("已经退出系统");
break;//该break是为了退出while的无限“菜单”循环
}
}
}
使用的编译环境是vs2019,源文件后缀是.cpp