用‘栈’的思想编写一个十进制转换二进制、八进制或十六进制的程序
根据进制转换方法,如十进制向二进制转换,将转换的十进制整数除以二进制基数(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;
}