C语言实现十进制数到十六进制数的转换(顺序栈和链栈两种方法)

本文介绍了用C语言实现十进制数到十六进制数的转换,并提供了两种方法:顺序栈和链栈实现。文章包含了完整的代码示例和详细的注释,帮助读者理解代码逻辑并学习数据结构的应用。

方法1:用顺序栈实现

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

#define STACK_INIT_SIZE 100 // 栈的初始大小
#define STACK_INCREMENT 10 // 栈的增量

typed ef struct
{
    int *base; // 栈底指针
    int *top; // 栈顶指针
    int stacksize; // 栈可用的最大容量
} SqStack;

// 初始化栈
void InitStack(SqStack *S)
{
    S->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
    if (!S->base)
        exit(1); // 分配内存失败
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
}

// 判断栈是否为空
int StackEmpty(SqStack S)
{
    return S.top == S.base;
}

// 入栈
void Push(SqStack *S, int e)
{
    if (S->top - S->base >= S->stacksize)
    {
        S->base = (int *)realloc(S->base, (S->stacksize + STACK_INCREMENT) * sizeof(int));
        if (!S->base)
            exit(1); // 分配内存失败
        S->top = S->base + S->stacksize;
        S->stacksize += STACK_INCREMENT;
    }
    *(S->top++) = e;
}

// 出栈
int Pop(SqStack *S)
{
    if (S->top == S->base)
        return -1; // 栈空
    return *(--S->top);
}

int main()
{
    int n, r;
    SqStack S;
    InitStack(&S);
    printf("请输入一个非负十进制数:");
    scanf("%d", &n);
    while (n)
    {
        r = n % 16;
        Push(&S, r);
        n /= 16;
    }
    if (StackEmpty(S))
        printf("0");
    while (!StackEmpty(S))
    {
        r = Pop(&S);
        if (r < 10)
            printf("%d", r);
        else
            printf("%c", r - 10 + 'A');
    }
    printf("\n");
    return 0;
}

方法2:用链栈实现

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

typed ef struct StackNode
{
    int data;
    struct StackNode *next;
} StackNode, *LinkStackPtr;

typed ef struct
{
    LinkStackPtr top;
    int count; // 栈的元素个数
} LinkStack;

// 初始化栈
void InitStack(LinkStack *S)
{
    S->top = NULL;
    S->count = 0;
}

// 判断栈是否为空
int StackEmpty(LinkStack S)
{
    return S.top == NULL;
}

// 入栈
void Push(LinkStack *S, int e)
{
    LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode));
    p->data = e;
    p->next = S->top;
    S->top = p;
    S->count++;
}

// 出栈
int Pop(LinkStack *S)
{
    if (S->top == NULL)
        return -1; // 栈空
    int e = S->top->data;
    LinkStackPtr p = S->top;
    S->top = S->top->next;
    free(p);
    S->count--;
    return e;
}

int main()
{
    int n, r;
    LinkStack S;
    InitStack(&S);
    printf("请输入一个非负十进制数:");
    scanf("%d", &n);
    while (n)
    {
        r = n % 16;
        Push(&S, r);
        n /= 16;
    }
    if (StackEmpty(S))
        printf("0");
    while (!StackEmpty(S))
    {
        r = Pop(&S);
        if (r < 10)
            printf("%d", r);
        else
            printf("%c", r - 10 + 'A');
    }
    printf("\n");
    return 0;
}

总结

本文介绍了用C语言实现十进制数到十六进制数的转换,并提供了两种方法:顺序栈和链栈实现。两种方法都使用了栈的特性,将十进制数的每一位依次入栈,然后出栈并转化为十六进制数输出。希望本文能够帮助读者更好地理解栈的数据结构以及在实际应用中的运用。

C语言实现十进制数到十六进制数的转换(顺序栈和链栈两种方法)

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

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