#include <stdio.h>
#include <stdlib.h>

typedef int SElemType; // 定义栈元素类型为整型

typedef struct {
    SElemType* data; // 栈的元素数组指针
    int top; // 栈顶指针
    int maxSize; // 栈的最大容量
} SqStack;

// 初始化栈
void InitStack(SqStack* s, int maxSize) {
    s->data = (SElemType*)malloc(sizeof(SElemType) * maxSize);
    s->top = -1;
    s->maxSize = maxSize;
}

// 入栈
void Push(SqStack* s, SElemType x) {
    if (s->top == s->maxSize - 1) {
        return; // 栈满,无法入栈
    }
    s->top++;
    s->data[s->top] = x;
}

// 出栈
SElemType Pop(SqStack* s) {
    if (s->top == -1) {
        return -1; // 栈空,无法出栈
    }
    SElemType x = s->data[s->top];
    s->top--;
    return x;
}

// 十进制转换为十六进制
void DecimalToHexadecimal(unsigned n) {
    SqStack s;
    InitStack(&s, 100);
    
    // 除以16取余数,将余数入栈,直到商为0
    while (n != 0) {
        Push(&s, n % 16);
        n = n / 16;
    }
    
    // 出栈并打印每个十六进制数位
    while (s.top != -1) {
        SElemType x = Pop(&s);
        if (x < 10) {
            printf('%d', x);
        } else {
            printf('%c', x - 10 + 'A');
        }
    }
    printf('\n');
}

int main() {
    unsigned n;
    scanf('%u', &n);
    DecimalToHexadecimal(n);
    return 0;
}

输入:

10

输出:

A

解释:

代码实现了一个DecimalToHexadecimal函数,该函数接受一个无符号整数作为输入,并使用顺序栈将其转换为十六进制数。

  1. 首先,初始化一个空栈。
  2. 循环执行以下操作,直到输入的十进制数变为0:
    • 计算十进制数除以16的余数。
    • 将余数压入栈中。
    • 将十进制数除以16。
  3. 循环执行以下操作,直到栈为空:
    • 从栈中弹出一个元素。
    • 如果元素小于10,则直接打印该元素。
    • 如果元素大于等于10,则将其转换为相应的十六进制字符('A' - 'F')并打印。

例如,对于输入10,程序执行以下步骤:

  1. 10 % 16 = 10,将10压入栈中。
  2. 10 / 16 = 0,循环结束。
  3. 从栈中弹出10,由于10大于等于10,将其转换为'A'并打印。

因此,最终输出为'A'。

C语言顺序栈实现十进制转十六进制

原文地址: https://www.cveoy.top/t/topic/OP0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录