用‘栈’的思想进行十进制转换二进制、八进制或十六进制

882 阅读3分钟

这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战

什么是栈?

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。


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

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

链栈

头文件<shujujiegou_lianzhan.h>
#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;
}

程序代码

#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;
}


运行结果图

图片