算法学习记录栈的应用进制转化

栈的应用

在进制转化过程中,其中10进制转化各种进制用处比较多。

原理就是拿十进制的数不停的 去除 进制的模数 得到余数组合就是转化后的数。

比如 (255)10  转化为 16进制 时候

254/16=15 ...14 ---> E

15/16=0...15 ---> F

255 即为 0XFE

注意到各个结果反过来才是最后的结果。想到栈的特点,这里可以用栈的结构,最先算出来的结果现存入到栈底,最后算出的在栈顶。

然后出栈就可以得到最后的结果。

这里我做一个10进制转16进制转化的程序。

添加之前写的栈的程序:

#include "stdafx.h"
#include<stdlib.h>

typedef struct stNode{ //栈的数据结构,一个数据和一个指针
    int data;
    struct stNode *next;
}stkNode,*pStkNode;

typedef struct listst{ //链栈的栈顶结构,一个栈的指针结构和一个计数
    pStkNode top;
    int count;
}listTop;

void prt_stack(listTop t)
{
    int len = t.count;
    printf("len is %d\n",len);
    pStkNode pos = t.top;
    while (len > 0)
    {
        int x = pos->data;
        printf(" %d ",x);
        pos = pos->next;
        len--;
    }
}
void init_stack(pStkNode *ls,listTop *t)
{
    *ls = (pStkNode)malloc(sizeof(stkNode));
    (*ls)->data = 0;
    (*ls)->next = NULL;
    (*t).count = 0;
    (*t).top = (*ls);
}

void pushstack(int elem,listTop *t)
{
    pStkNode n = (pStkNode)malloc(sizeof(stkNode)); //(a)
    n->data = elem;                                    //(b)
    n->next = (*t).top;                                //(c)
    (*t).top = n;                                    //(d)
    (*t).count = (*t).count +1;
}

void popstack(listTop *t)
{
    pStkNode p = (*t).top;
    (*t).top = (*t).top->next;
    (*t).count = (*t).count - 1;
    free(p);
}

先在主函数中定义链栈:

int main()
{
    pStkNode list=NULL;
    listTop top;
    init_stack(&list,&top);//相当于 top和list绑定了
//...
}            


后面添加转化函数:

void convHex(int nn,listTop *top)
{
    int mod;
    int di;
    while (nn)
    {
        
        di = nn/16;
        mod = nn%16;
        pushstack(mod,top);
        nn = di;
    }
}

这里每次把余数存放到以top指向的链栈中。链栈中存放的是十进制的数,比如F是以15的形式存放在其中。还要在显示的时候将15转化为F。

下面这个函数就是将十进制字符转换为十六进制的字符:

char dispc(int x)
{
    if (x < 10)
    {
        return x;
    }
    else
    {
    
        return 'A'+(x-10);
    }
}

由于只需要打印出来,并不需要存放在硬盘上,所以只需要输出到控制台的屏幕上即可。这里将单个十进制字符转化为十六进制的字符即可。

void resHex(listTop t)
{
    int len = t.count;
    pStkNode pos = t.top;
    printf("0x");
    while (len > 0)
    {
        int x = pos->data;
        char cx=dispc(x);
        printf("%c",cx);
        pos = pos->next;
        len--;
    }
    printf("\n");
}

完整的主函数:

int _tmain(int argc, _TCHAR* argv[])
{
    
    int num;
    pStkNode list=NULL;
    listTop top;
    init_stack(&list,&top);//相当于 top和list绑定了

    printf("this program is 10 to hex\n");
    printf("please input a number:");
    scanf("%d",&num);
    printf("you put the number is %d\n",num);
    getchar();
    convHex(num,&top);
//    prt_stack(top);
    resHex(top);


    getchar();
    return 0;
}


运行之后:

原文地址:https://www.cnblogs.com/jsgnadsj/p/3408627.html