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

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

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

首先运用顺序栈

头文件<shujujiegou_shunxuzhan.h>

#include <stdlib.h>
#define MAX 100
typedef int SElemType;

typedef struct
{
 SElemType   base[MAX]; 	// 栈底指针
 int  top;            		// 栈顶指针
                      		//当前已分配的存储空间,以元素为单位。
}SqStack;
bool InitStack( SqStack &s )
{				// 初始化顺序栈, 构造一个空栈
 s.top =-1;
 return true;
}// InitStack
bool Push(SqStack &s,SElemType e)
{				//把元素e入栈
   if( s.top ==MAX-1) 		// 若栈满,返回false
       return false;
    s.top++;
  s.base[s.top]= e;
  return true;     
}// Push
bool Pop( SqStack &s, SElemType &e )
{				// 出栈
 if( s.top == -1) 		// 空吗?
   return false;
 e = s.base[s.top]; 
 s.top --;
 return true;
}// Pop
bool StackEmpty(SqStack s)
{				//判栈空
   return(s.top==-1);
}
主程序
#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");
} // conversion
int 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>
#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;
}

运行结果图

运行结果图

发布了30 篇原创文章 · 获赞 29 · 访问量 9299

猜你喜欢

转载自blog.csdn.net/qq_44629109/article/details/102826046