数据结构——栈的基本操作(C语言实现)

#include "stdio.h"
#include "malloc.h"	//用于malloc、realloc函数

#define size 10 //存储空间分配增量

typedef int type;

typedef struct stack
{
	type* base;//栈底元素
	type* top;//栈顶元素
	int stacksize;//栈的空间大小
}Sqstack;

type InitStack(Sqstack* S); //初始化栈函数
type StackEmpty(Sqstack* S); //判断是否为空栈
type Push(Sqstack* S, type e); //入栈
type Pop(Sqstack* S, type* e); //出栈
type GetTOP(Sqstack* S, type* e);//取栈顶元素
void stackprint(Sqstack* S);//遍历栈函数
void conversion();//进制转换

void main()
{
	Sqstack S1; //定义栈
	int i = 1; //循环选择变量初始值为1
	type e; //用于传递参数
	while (i)
	{
		printf("该程序用于实现栈的基本操作\n");
		printf("1---------------栈进行初始化\n");
		printf("2---------------判断是否空栈\n");
		printf("3---------------入栈\n");
		printf("4---------------出栈\n");
		printf("5---------------取栈顶元素\n");
		printf("6---------------进制转换\n");
		printf("0---------------退出\n");
		scanf_s("%d", &i); //输入i进行操作选择

		switch (i)
		{
		case 1:
			if (InitStack(&S1)) //将栈S1传给函数进行初始化,用返回值判断是否初始化成功
			{	//初始化成功
				printf("栈初始化成功\n\n"); 
			}
			else
			{	//初始化失败
				printf("栈初始化失败\n\n");
			}
			break;
		case 2:
			if (StackEmpty(&S1)) //判断栈是否为空栈
			{	//返回值1为空栈
				printf("该栈是空栈\n\n");
			}
			else
			{	//返回值0不为空栈
				printf("该栈不是空栈\n\n");
			}
			break;
		case 3:
			printf("请输入要入栈的元素");
			scanf_s("%d", &e); //输入入栈元素
			Push(&S1, e); //调用函数
			stackprint(&S1); //打印栈
			break;
		case 4:
			if (Pop(&S1, &e)) //调用函数出栈 并判断是否出栈成功
			{	//出栈成功
				printf("出栈的元素是%d\n", e); 
				stackprint(&S1); //出栈成功 打印栈
			}
			else
			{	//出栈函数返回0,出栈失败
				printf("出栈失败\n");
			}
			break;
		case 5:
			if (GetTOP(&S1, &e))//调用函数获取栈顶
			{	//不为空栈,返回打印栈顶
				printf("栈顶元素%d\n", e);
			}
			else
			{	//目前栈为空栈
				printf("该栈为空栈\n");
			}
			break;
		case 6:
			conversion(); //进制转换函数
		break;
		}
	}
}

type InitStack(Sqstack* S)  //初始化栈函数
{
	S->base = malloc(sizeof(type) * size); //给栈赋值内存空间
	if (S->base) //判断是否初始化成功

	{	//初始化成功
		S->top = S->base; //初始化成功后,栈为空栈,栈顶就是栈底 没有元素
		S->stacksize = size;//初始化成功后,栈的空间大小为赋值给的内存空间基数size
		return 1;//初始化成功 返回1用于判断
	}
	else
	{	//初始化失败
		return 0;//初始化失败 返回0用于判断
	}

}

type StackEmpty(Sqstack* S) //判断是否为空栈
{
	if (S->top == S->base)//如果栈顶等于栈底 这个栈就是个空栈
	{
		return 1;//空栈返回1
	}
	else
	{
		return 0;//非空栈返回0
	}
}

type Push(Sqstack* S, type e) //入栈
{
	if (S->top - S->base >= S->stacksize) //判断当前栈内存空间是否足够
	{
		S->base = realloc(S->base, sizeof(type) * (size + S->stacksize)); //扩充内存空间
		if (S->base)//判断是否扩充成功
		{
			S->top = S->base + S->stacksize; //栈顶位置改变
			S->stacksize += size; //栈的大小改变
		}
		else
		{
			return 0; //扩充失败 退出
		}
	}
	*S->top = e;//赋值元素
	S->top++;//入栈修改栈顶位置
	return 1;
}

type Pop(Sqstack* S, type* e) //出栈
{	//移除栈:将top指针指向栈的下一个元素,栈顶元素不在栈内为出栈
	if (S->top == S->base) //判断栈内是否有元素
	{
		return 0; //没有元素退出
	}
	else
	{
		S->top--;//栈顶减1
		*e = *S->top; //有元素则将元素赋值给e返回到main函数
		//可合并为*e=--*S->top
		return 1;
	}
}

type GetTOP(Sqstack* S, type* e)//取栈顶元素
{
	if (S->top == S->base) //判断栈内是否有元素
	{
		return 0; //空栈退出
	}
	else
	{
		*e = *(S->top-1); //栈顶元素赋值给e返回到main函数
		return 1;
	}
}

void conversion()//进制转换
{
	int n, n1, n2, n3;//存放输入的数
	type m;
	int B = 2, O = 8, H = 16;//B为2进制 O为8进制 H为16进制
	Sqstack S; //定义栈

	InitStack(&S); //初始化栈
	printf("请输入要转换进制的数"); //输入要转换的数
	scanf_s("%d", &n); //输入

	n1 = n2 = n3 = n; //将n的值赋值给三个变量,用于每次除模运算


	//十进制转换二进制
	while (n1)//n1不为0继续循环
	{
		Push(&S, n1 % B);//n1模2的值入栈
		n1 /= B; //n1除2
	}
	printf("将10进制数%d转为2进制数是", n);
	while (!StackEmpty(&S))//判断栈是否为空栈
	{
		Pop(&S, &m); //入栈的值,逆序出栈
		printf("%d", m); //打印每次的栈顶
	}
	printf("\n");

	//十进制转换八进制
	while (n2)
	{
		Push(&S, n2 % O);//n2模8的值入栈
		n2 /= O; //n2除8
	}
	printf("将10进制数%d转为8进制数是", n);
	while (!StackEmpty(&S))//判断栈是否为空栈
	{
		Pop(&S, &m);//入栈的值,逆序出栈
		printf("%d", m);//打印每次的栈顶
	}
	printf("\n");

	//十进制转换十六进制
	printf("将10进制数%d转为16进制数是", n);
	while (n3)
	{
		Push(&S, n3 % H);//n3模16的值入栈
		n3 /= H;//n3除16
	}
	while (!StackEmpty(&S))//判断栈是否为空栈
	{	
		Pop(&S, &m);//值逐一出栈
		if (m < 10) printf("%d", m); //判断出栈的值m
		else if (m % H == 10) printf("A");
		else if (m % H == 11) printf("B");
		else if (m % H == 12) printf("C");
		else if (m % H == 13) printf("D");
		else if (m % H == 14) printf("E");
		else if (m % H == 15) printf("F");
	}
	printf("\n");
	
}

void stackprint(Sqstack* S)//遍历栈函数
{
	int n = 0; //计数器从0开始
	printf("当前栈的元素有:");

	while (S->top-n != S->base) //判断top-n后是否等于栈底
	{
		printf("%d ", *(S->top - n - 1)); //打印top-n-1的元素
		n++; //累加器累加
	}
	printf("\n");//打印
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值