前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用‘栈’的思想编写一个十进制转换二进制、八进制或十六进制的程序

用‘栈’的思想编写一个十进制转换二进制、八进制或十六进制的程序

作者头像
跋扈洋
发布2021-02-02 14:06:27
8360
发布2021-02-02 14:06:27
举报
文章被收录于专栏:物联网知识

用‘栈’的思想编写一个十进制转换二进制、八进制或十六进制的程序

根据进制转换方法,如十进制向二进制转换,将转换的十进制整数除以二进制基数(2),得到余数和商,如果商不为0,该商继续做被除数,除以基数,得到余数和商,此过程一直进行,直到得到的商为0时停止,此时得到的所有余数逆序排列就是转换得到的二进制数。十进制转换其他进制(八、十六)方法和当前方法相同,故可以扩展得到十进制向二、八、十六进制转换的统一算法。由于十进制数转换其他进制数时符合栈的特点“先进后出”,即先得到的余数是低位,后得到的余数是高位,因此这里利用栈做工具,保存转换过程中得到的余数。这里的栈需要自己定义,可以定义顺序栈,也可以定义链栈。可以将栈的定义及其基本操作放在一个头文件中,如果哪个程序需要就可以包含该头文件,而不需要每次都重新编写栈的代码。

首先运用顺序栈

头文件<shujujiegou_shunxuzhan.h>
代码语言:javascript
复制
#include <stdlib.h>#define MAX 100typedef int SElemType;
typedef struct{ SElemType   base[MAX];   // 栈底指针 int  top;                // 栈顶指针                          //当前已分配的存储空间,以元素为单位。}SqStack;bool InitStack( SqStack &s ){        // 初始化顺序栈, 构造一个空栈 s.top =-1; return true;}// InitStackbool Push(SqStack &s,SElemType e){        //把元素e入栈   if( s.top ==MAX-1)     // 若栈满,返回false       return false;    s.top++;  s.base[s.top]= e;  return true;     }// Pushbool Pop( SqStack &s, SElemType &e ){        // 出栈 if( s.top == -1)     // 空吗?   return false; e = s.base[s.top];  s.top --; return true;}// Popbool StackEmpty(SqStack s){        //判栈空   return(s.top==-1);}

主程序

代码语言:javascript
复制
#include <stdio.h>#include"shujujiegou_shunxuzhan.h"void conversion (int N,int B) {     SqStack S;    int temp,x;    InitStack(S); // 构造空栈    while (N)  {           temp=N%B;   Push(S,temp);   N=N/B; } while (!StackEmpty(S))     {      Pop(S,x);        switch(x)  {  case 10:putchar('A');break;  case 11:putchar('B');break;  case 12:putchar('C');break;  case 13:putchar('D');break;  case 14:putchar('E');break;  case 15:putchar('F');break;  default :printf("%d",x);//x<=9时原样输出  }   } printf("\n");} // conversionint main(){     int m,n;     printf("这是一个十进制数转化为二进制数、八进制数及十六进制数的演示程序……\n");     printf("请输入十进制数:");     scanf("%d",&m);     printf("\n");     printf("请输入你想将十进制转换成的进制:");     scanf("%d",&n);     printf("十进制的%d转换成%d进制的数是:",m,n);     conversion(m,n);     printf("\n");     return 0;}

链栈

头文件<shujujiegou_lianzhan.h>
代码语言:javascript
复制
#include <stdlib.h>typedef char ElemType ;typedef struct linknode{    ElemType data;    struct linknode *next;  }LiStack;  void InitStack(LiStack * &s);//构造空栈  void DestoryStack(LiStack * &s);//销毁栈  bool StackEmpty(LiStack * s);//判栈空  void Push(LiStack * &s, ElemType e);//压栈  bool Pop(LiStack * &s, ElemType &e);//出栈  bool GetTop(LiStack * s, ElemType &e);//取栈顶元素  void InitStack(LiStack * &s){      s = (LiStack * )malloc(sizeof(LiStack));   s -> next = NULL;   }   void DestoryStack(LiStack * &s){       LiStack * p = s, *q = s -> next;   while(q != NULL)    {           free(p);             p = q;           q = p -> next;    }   }   bool StackEmpty(LiStack * s){    return (s -> next == NULL);}void Push(LiStack * &s, ElemType e){    LiStack * p;    p = (LiStack *)malloc(sizeof(LiStack));    p -> data = e;    p -> next = s -> next;    s -> next = p;}bool Pop(LiStack * &s, ElemType &e){    LiStack * p;    if(s -> next == NULL)        return false;    p = s -> next;    e = p -> data;    s -> next = p -> next;    free(p);    return true;}bool GetTop(LiStack * s, ElemType &e){    if(s -> next == NULL)        return false;    e = s -> next -> data;    return true;}

程序代码

代码语言:javascript
复制
#include<stdio.h>#include<stdlib.h>#include"shujujiegou_lianzhan.h"void   trans(int a,int b){     LiStack * s;    InitStack(s);    int yu;    ElemType e;    while(a)     {        yu = a % b;        if(yu >= 10)         {            ElemType p = yu + 'A' - 10;//转换为对应字符的ASCII值            Push(s, p);        }        else         {            ElemType p = yu + '0';//转换为对应数字字符的ASCII值            Push(s, p);        }        a /= b;    }        while(!StackEmpty(s))    {        Pop(s, e);        printf("%c", e);    }    printf("\n");    DestoryStack(s);}int main(){    int n;    while(1)    {    printf("————十进制向二进制、八进制、十六进制转换器—————\n\n");    printf("请输入一个十进制数(要求大于或等于零,其他则退出!):");    scanf("%d", &n);    if(n<0) break;    printf("十进制数%d转换为二进制数为:",n);    trans(n,2);    printf("十进制数%d转换为八进制数为:",n);    trans(n,8);    printf("十进制数%d转换为十六进制数为:",n);    trans(n,16);    system("pause");//暂停作用,包含在stdlib.h中    system("cls");//清屏作用,包含在stdlib.h中       }        return 0;}

运行结果图

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 物联网知识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用‘栈’的思想编写一个十进制转换二进制、八进制或十六进制的程序
    • 首先运用顺序栈
      • 链栈
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档