链栈的基本操作

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值