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


    栈的应用

    在进制转化过程中,其中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;
    }


    运行之后:

  • 相关阅读:
    Java多线程
    SpringCloud
    Java 多线程
    MySQL
    MySQL
    SpringCloud
    SpringCloud
    SpringCloud
    SpringBoot
    Spring MVC
  • 原文地址:https://www.cnblogs.com/jsgnadsj/p/3408627.html
Copyright © 2020-2023  润新知