栈可以非常方便地用于进制转换,其基本思想如下:

对于任意一个数,无论是什么进制,它的每一位都是由该进制下的基数的幂次方组成的,例如十进制数 1234,它的每一位可以表示为:

1 × 10³ + 2 × 10² + 3 × 10¹ + 4 × 10⁰

因此,将一个数从一种进制转换到另一种进制,可以分成两步:

将原数转换为十进制数。
将十进制数转换为目标进制数。
其中第一步可以用一些常用的公式来实现,例如对于一个n进制的数num(num[n-1]表示最高位,num[0]表示最低位),其转换为十进制数的公式为:

num[0] × n⁰ + num[1] × n¹ + … + num[n-1] × n^(n-1)

第二步可以用栈来实现,具体思路是:

用目标进制数base去除十进制数,将余数压入栈中。
将十进制数除以目标进制数,重复步骤1,直到十进制数为0。
从栈底到栈顶依次出栈,输出每个余数,即为目标进制下的数。
需要注意的是,在第二步中,如果余数小于10,则直接输出数字;如果余数大于等于10,则需要输出对应的字母。

综上所述,栈是一种非常适合用于进制转换的数据结构,可以方便地将一个数从一种进制转换为另一种进制。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 100

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

// 初始化栈
void InitStack(SeqStack* s) {
    s->top = -1;
}

// 判断栈是否为空
int IsEmpty(SeqStack* s) {
    if (s->top == -1) {
        return 1;
    }
    else {
        return 0;
    }
}

// 判断栈是否已满
int IsFull(SeqStack* s) {
    if (s->top == MAXSIZE - 1) {
        return 1;
    }
    else {
        return 0;
    }
}

// 元素入栈
void Push(SeqStack* s, int value) {
    if (IsFull(s)) {
        printf("Stack overflow!\n");
        exit(1);
    }
    s->top++;
    s->data[s->top] = value;
}

// 元素出栈
int Pop(SeqStack* s) {
    if (IsEmpty(s)) {
        printf("Stack underflow!\n");
        exit(1);
    }
    int value = s->data[s->top];
    s->top--;
    return value;
}

// 获取栈顶元素
int GetTop(SeqStack* s) {
    if (IsEmpty(s)) {
        printf("Stack is empty!\n");
        exit(1);
    }
    return s->data[s->top];
}

// 将一个任意进制数转换为十进制数
int OtherToDec(char* num, int base) {
    int dec = 0;
    int len = strlen(num);
    for (int i = 0; i < len; i++) {
        int digit = num[i] - '0';
        if (digit >= 10) {
            digit = num[i] - 'A' + 10;
        }
        dec = dec * base + digit;
    }
    return dec;
}

// 将十进制数转换为任意进制数
void DecToOther(int dec, int base) {
    SeqStack s;
    InitStack(&s);
    while (dec > 0) {
        Push(&s, dec % base);
        dec /= base;
    }
    while (!IsEmpty(&s)) {
        int digit = Pop(&s);
        if (digit < 10) {
            printf("%d", digit);
        }
        else {
            printf("%c", digit - 10 + 'A');
        }
    }
}

// 将一个任意进制数转换为另一个任意进制数
void OtherToOther(char* num, int src_base, int dst_base) {
    int dec = OtherToDec(num, src_base);
    DecToOther(dec, dst_base);
}

int main() {
    char num[MAXSIZE];
    int src_base, dst_base;
    printf("Please input a number: ");
    scanf("%s", num);
    printf("Please input the source base: ");
    scanf("%d", &src_base);
    printf("Please input the destination base: ");
    scanf("%d", &dst_base);
    printf("Result: ");
    OtherToOther(num, src_base, dst_base);
    printf("\n");
    return 0;
}