使用顺序栈进行进制转换

/****************************************************************
 * name;Decimal To Hexdecimal
 * function:进制转换
 * parameter;
 * ReValue;
 * author;小北blog
 * attention;
 * date;2024.04.25
 * history;
 * version;
 * Copyright(c) 2024 huahuadebaby99@163.com All rights Reserved
 *****************************************************************/

/*进制转换函数接口 非负数十进制转成十六进制*/

#define Size 100
// 定义栈结构体
typedef struct
{
    int data[Size];
    int top;
} Stack;

// 初始化栈
void init_Stack(Stack *stack)
{
    int top = -1;
}
// 判断栈空间是否为空
bool IsEmpty(Stack *stack)
{
    return stack->top == -1;
}
// 判断栈空间是否已满
bool IsFull(Stack *stack) // 传入的是栈结构体
{
    return stack->top == Size - 1; // top的值为-1开始
}
// 入栈
void Push(Stack *stack, int value)
{
    if (!IsFull(stack)) // 不为空的情况下
    {
        stack->data[++stack->top] = value; // 将value的值放到栈空间data里面
    }
}

// 出栈
int Pop(Stack *stack)
{
    if (!IsEmpty(stack))
    {
        return stack->data[stack->top--];
    }
    return -1; // 返回-1表示栈为空
}
// 十进制Dec转换到十六进制Hex,创建函数,输入十进制
int DectoHex(int decimal)
{
    // 调用stack结构体
    Stack stack;
    // 调用已初始化栈结构体
    init_Stack(&stack);
    // 记录存放先进入栈空间的值
    int recodes;
    while (decimal != '0') // 循环找到16进制尾数
    {
        recodes = decimal % 16; // 取模,当decimal循环n次后小于16时栈顶的值为16进制的尾数
        Push(&stack, recodes);  // 入栈
        decimal = decimal / 16; // 更新十进制的值
    }
    while (!IsEmpty(&stack)) // 如果栈结构体出栈完,为空
    {
        // 出栈操作
        int inten = Pop(&stack);
        if (inten < 10)
        {
            printf("%d", inten);
        }
        else
        {
            printf("%c", 'A' + inten - 10);
        }
    }
}
int main()
{
    int Dec;
    printf("输入一个非负整数!!!");
    scanf("%d", &Dec);
    if (Dec < 16)
    {
        printf("输入有误,请输入有效的值!!!");
        return -1;
    }
    DectoHex(Dec);
    return 0;
}

总结:顺序在和使用普通的数组进行操作进制转换本质上是没有任何区别的,但是顺序栈封装了许多个函数,让其使用更加的灵活

posted @ 2024-04-25 14:50  小北bolg  阅读(55)  评论(0)    收藏  举报