十六进制转十进制的C语言实现

嘻嘻,用到了前几天学到的循环队列,认识到了数据结构的魅力。
将输入的数据入队后,再挨个出队,首先检查队列的前两个数据是否为‘0x’
若是,再将其他数据出队,并且完成一系列操作。

//————————————————————————
//十六进制转十进制(队列)
#include  
#define maxSize 10
int product2(int n);
int word2num(char w);
int hTod(char a[]);
struct xQueue {
    char data[maxSize];
    int front, rear;
    int length;//表示队列长度

};

int main() {
    char a[50];
    gets(a);
    printf("%d\n",hTod(a));
}

int hTod(char a[]) {
    char c, b, d;
    int num = 0, numDem = 0;
    struct xQueue que;
    que.front = 0; que.rear = 0;
    que.length = 0;//初始化循环队列
    char *p = a;
    while (*p != '\0') {
        if (que.front == (que.rear + 1) % maxSize)
            return -1;//队列满
        else {
            que.rear = (que.rear + 1) % maxSize;
            que.data[que.rear] = *p++;
            que.length++;
        }       

    }
    que.front = (que.front + 1) % maxSize;
    c = que.data[que.front];
    que.length--;
    if (c == '0') {
        que.front = (que.front + 1) % maxSize;
        b = que.data[que.front];
        que.length--;
        if (b != 'x')
            return -2;//表示输入不是十六进制
    }
    else
        return -2;
    while (que.front != que.rear) {
        que.front = (que.front + 1) % maxSize;
        d = que.data[que.front];
        if (d >= 'A' && d <= 'F')
            num = word2num(d);
        else if (d >= '0' && d <= '9')
            num = d - '0';
        else
            return -3;//表示不符合十六进制的格式
        que.length--;
        numDem = numDem + num*product2(que.length);
    }
    return numDem;
}

int word2num(char w) {
    int num;
    switch(w) {
        case 'A': num = 10; break;
        case 'B': num = 11; break;
        case 'C': num = 12; break;
        case 'D': num = 13; break;
        case 'E': num = 14; break;
        case 'F': num = 15; break;
        default:num = -1;
    }
    return num;
}

int product2(int n) {
    if (n == 0)
        return 1;
    else if (n == 1)
        return 16;
    else
        return 16 * product2(n-1);
}

你可能感兴趣的:(C/C++)