您当前的位置: 首页 > 

跋扈洋

暂无认证

  • 8浏览

    0关注

    216博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

跋扈洋 发布时间:2019-10-30 20:32:39 ,浏览量:8

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

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

首先运用顺序栈 头文件

#include 
#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 
#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 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
#include
#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            
关注
打赏
1661997710
查看更多评论
0.0543s