您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验:将十进制数转成其它进制,C语言实现

2016-04-28 00:00 507 查看
摘要: 顺序栈数据结构将输入的十进制数转成想要转成的进制。

在Visual Studio调试通过
代码:
#define _CRT_SECURE_NO_WARNINGS
//十进制整数转化为R进制整数算法
#include <stdlib.h>
#include<stdio.h>
#define MAXSIZE 100

typedef struct {
int data[MAXSIZE];
int top;
}SeqStack, *PSeqStack;

float X;
int R;
void NumConvert(int X, int R);
PSeqStack Init_SeqStack(PSeqStack S);
int Empty_SeqStack(PSeqStack S);
int Push_SeqStack(PSeqStack S, int x);
int Pop_SeqStack(PSeqStack S, int * x);
int GetTop_SeqStack(PSeqStack S, int * x);
void Destroy_SeqStack(PSeqStack *S);
void Judge(PSeqStack S);
void InputX();
void InputR();
void DisplayStack(PSeqStack S);//定义

int main()
{
//float X;
//int R;
InputX();
InputR();
NumConvert(X, R);
system("pause");
return 0;
}

/***************************函数*******************************/
void NumConvert(int X, int R)//X为十进制整数 R是要转换成的进制
{
int Nega_X, t;//x可能为负数,需要转换成正数
PSeqStack S;
S = (PSeqStack)malloc(sizeof(SeqStack));
//SeqStack &S;
Init_SeqStack(S);

if (R <= 10)
{
if (X < 0)
{
Nega_X = -X;

while (Nega_X != 0)
{
t = Nega_X%R;
Push_SeqStack(S, t);
Nega_X = Nega_X / R;
}
Push_SeqStack(S, 1);//-数符号位为1
}
else if (X >= 0)
{
while (X != 0)
{
t = X%R;
Push_SeqStack(S, t);
X = X / R;
}
Push_SeqStack(S, 0);
}
DisplayStack(S);
Destroy_SeqStack(&S);
}
else if (R = 16)
{
if (X < 0)
{
Nega_X = X;
while (Nega_X)
{
t = Nega_X%R;
Push_SeqStack(S, t);
Nega_X = Nega_X / R;
}
Push_SeqStack(S, 1);
}
else if (X >= 0)
{
while (X)
{
t = X%R;
Push_SeqStack(S, t);
X = X / R;
}
Push_SeqStack(S, 0);
}
Judge(S);
Destroy_SeqStack(&S);
}
//else {
//	printf("请输入正确的进制数!!\n");
//	InputR();
//}
}

//初始化栈
#pragma region 初始化
PSeqStack Init_SeqStack(PSeqStack S)
{
//PSeqStack S;//指向顺序栈的指针

if (S) {
S->top = NULL;
}
return S;
}
#pragma endregion

//判空
int Empty_SeqStack(PSeqStack S)
{
if (-1 == S->top) {
return 1;
}
else {
return 0;
}
}

//入栈
int Push_SeqStack(PSeqStack S, int x)
{
if (S->top == MAXSIZE - 1)
return 0;
else
{
S->top++;
S->data[S->top] = x;
return 1;
}
}

//出栈
int Pop_SeqStack(PSeqStack S, int * x)
{/*删除栈顶元素并保存在*x  */
if (Empty_SeqStack(S))
{
return 0;
}
else
{
*x = S->data[S->top];
S->top--;
return 1;
}
}

//取栈顶元素
int GetTop_SeqStack(PSeqStack S, int * x)
{
if (Empty_SeqStack(S))//!=0  即为空
{
return 0;
}
else {
*x = S->data[S->top];
return 1;
}
}

//销毁栈
void Destroy_SeqStack(PSeqStack *S)
{
if (*S)
free(*S);
*S = NULL;
return;
}

//判断16进制
void Judge(PSeqStack S)
{
int i;
printf("输出为(左边第一位为符号位)\n");
for (i = S->top; i > 0; i--)
{

switch (S->data[i])
{
case 10:printf("A");
break;
case 11:printf("B");
break;
case 12:printf("C");
break;
case 13:printf("D");
break;
case 14:printf("E");
break;
case 15:printf("F");
break;
default:printf("%d", S->data[i]);
break;
}
}
}

//输入
void InputX()
{

printf("请输入一个十进制整数:\n");
scanf("%f", &X);
while (X != (int)X)
{
printf("你输入的不是整数!!\n");
InputX();
}
//X = (int)X;
}
void InputR()
{
printf("\n请输入希望转成的进制数:\n");
scanf("%d", &R);
while (R > 10 && R>16)
{
printf("关于大于10的进制中只支持小于等于16进制!请重新输入:\n");
scanf("%d", &R);
}
}

//输出
void DisplayStack(PSeqStack S)
{
int i;
printf("%d 进制输出为(左边第一位为符号位,0为正):\n",R);
for (i = S->top; i > 0; i--)
{
printf("%d", S->data[i]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息