栈 10进制转16进制

#include<winuser.inl>
#include<stdio.h>
#include <time.h>
#include <cstdlib>
#include <string.h>

/*
		栈的应用实例 -- 数进制转换
		要求:输入任意的正整数N(十进制),分别输出该整数的二进制,八进制,十六进制的结果

		计算公式: N = (N / d) + N mod d

		216(十进制) = 330(八进制) = D8(十六进制) = (11011000)二进制

		短除法
		(十进制转8进制)
		N       N /8    N mod 8
		216     27      0
		27       3      3
		3        0      3

		(十进制转16进制)
		N       N /16    N mod 16
		216     13       8
		13      0        D

		16进制里面的数字组成  0~9 A(10) B(11) C(12) D(13) E(14) F(15)

		**************************
		和栈的关系
		先是余数进栈,直到除数为0,最后一个数进栈
		然后将所有余数出栈
*/

//坐标栈,二维坐标(x,y)

#define capacity 10
typedef  struct change
{
	int interge;
	char letter;

}Change_2_to_16;

typedef  struct tag_stack
{
	Change_2_to_16* pBuffer;
	int top;
	int length;
}Stack;

bool InitStack(Stack** pStack)
{
	(*pStack) = (Stack*)malloc(sizeof(Stack));
	if (*pStack == NULL)
	{
		printf("Stack failed\n");
		return false;
	}
	else
	{
		(*pStack)->pBuffer = (Change_2_to_16*)malloc(sizeof(Change_2_to_16) * capacity);
		if ((*pStack)->pBuffer == NULL)
		{
			printf("(*pStack) -> pBuffer failed\n");
			return false;
		}
		else
		{
			(*pStack)->top = 0;
			(*pStack)->length = 0;
			return true;
		}
	}
}

void DestoryStack(Stack* pStack)
{
	free(pStack->pBuffer);
	pStack->pBuffer = NULL;
	free(pStack);
	pStack = NULL;
}

void ClearStack(Stack* pStack)
{
	pStack->top = 0;
	pStack->length = 0;
}

bool StackEmpty(Stack* pStack)
{
	if (pStack->length == 0)
	{
		printf("stack is empty\n");
		return true;
	}
	else
	{
		return false;
	}
}

bool StackFull(Stack* pStack)
{
	if (pStack->length == capacity)
	{
		printf("stack is full\n");
		return true;
	}
	else
	{
		return false;
	}
}

int StackLength(Stack* pStack)
{
	return pStack->length;
}

int Push(Stack* pStack, int *elem, int N)
{
	//elem这里是被除数,也就是上一次短除法的商
	if (StackFull(pStack))
	{
		printf("full\n");
		return -1;
	}
	else
	{
		int yu_shu, shang;
		shang = *elem / N;
		yu_shu = *elem % N;

		if (yu_shu >= 10)
		{
			pStack->pBuffer[pStack->top].interge = -1;
			if (yu_shu == 10)
			{
				pStack->pBuffer[pStack->top].letter = 'A';
			}
			else if(yu_shu == 11)
			{
				pStack->pBuffer[pStack->top].letter = 'B';
			}
			else if (yu_shu == 12)
			{
				pStack->pBuffer[pStack->top].letter = 'C';
			}
			else if (yu_shu == 13)
			{
				pStack->pBuffer[pStack->top].letter = 'D';
			}
			else if (yu_shu == 14)
			{
				pStack->pBuffer[pStack->top].letter = 'E';
			}
			else if (yu_shu == 15)
			{
				pStack->pBuffer[pStack->top].letter = 'F';
			}
		}
		else
		{
			pStack->pBuffer[pStack->top].interge = yu_shu;
			pStack->pBuffer[pStack->top].letter = 'N';
		}		
		pStack->top++;
		pStack->length++;
		return shang;
	}

}

bool Pop(Stack* pStack , Change_2_to_16* elem)
{
	if (StackEmpty(pStack))
	{
		return false;
	}
	else
	{
		 
		pStack->top--;
		pStack->length--;
		elem ->interge = pStack->pBuffer[pStack->top].interge;
		elem ->letter  = pStack->pBuffer[pStack->top].letter;
		return true;
	}
}

void Printf(Stack* pStack, bool isFromBottom)
{
	if (isFromBottom)
	{
		for (int i = 0; i <= pStack->length - 1; i++)
		{
			if (pStack->pBuffer[i].interge != -1)
			{
				printf("%d", pStack->pBuffer[i].interge);
			}

			if (pStack->pBuffer[i].letter != 'N')
			{
				printf("%c", pStack->pBuffer[i].letter);
			}		
		}
	}
	else
	{
		for (int i = pStack->length - 1; i >= 0; i--)
		{
			{
				if (pStack->pBuffer[i].interge != -1)
				{
					printf("%d", pStack->pBuffer[i].interge);
				}

				if (pStack->pBuffer[i].letter != 'N')
				{
					printf("%c", pStack->pBuffer[i].letter);
				}
			}
		}
	}
	printf("\n");
}

int main()
{
	Stack* mysatck = NULL;
	int number = 216, N = 16, num1, num2;
	//printf("请输入你要转换的10进制数:");
	//scanf_s("%d", &number);
	//printf("请输入你要将10进制转换成几进制数:");
	//scanf_s("%d", &N);

	num1 = number;
	if (InitStack(&mysatck))
	{
		//printf("the length is:%d \n", StackLength(mysatck));
		do
		{
			num1 = Push(mysatck, &num1, N);
		} while (num1 != 0);

		printf("the length is:%d \n", StackLength(mysatck));
		printf("%d 转换为 %d进制的结果是 :", number, N);
		Printf(mysatck, 0);

		//Change_2_to_16* elem = NULL;
		//Pop(mysatck, elem);
	}
	else
	{
		printf("initial failed\n");
	}
	return 0;
}

在这里插入图片描述

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值