将一个非负十进制数N,转换为基为B进制数的问题,一般采取“除B取余”来解决
由于最先得到的余数是转化结果的最低位而最后得到的转化结果是最高位,因此很容易联想到用栈来解决
下面给出算法:
typedef int DataType;
void MultiBaseOutput(int N,int B)
{//假设N是非负的十进制数,输出等值的B进制数
int i;
SeqStack S;
InitStack(&S);
while(N)
{
push(&S,N%B);
N = N/B;
}
while(!StackEmpty(&S))//栈非空时退栈输出
{
i = Pop(&S);
printf("%d",i);
}
}
下面给出完整一例:十进制数13转换成2进制的结果
#include <stdio.h>
#include <stdlib.h>
#define StackSize 20 //假定预先分配20个元素
typedef int DataType;//假定栈元素的数据类型为字符
typedef struct
{
DataType data[StackSize];
int top;
}SeqStack;
//栈置空
void InitStack(SeqStack *S)
{
//将顺序栈置空
S->top = -1;
}
//判断栈是否为空
int StackEmpty(SeqStack *S)
{
return S->top== -1;
}
//判断栈是否已满
int StackFull(SeqStack *S)
{
return S->top==StackSize-1;
}
//进栈
void Push(SeqStack *S,int x)
{
if(StackFull(S))
{
printf("Stack overflow");//栈满,退出运行
exit(0);
}
S->data[++S->top] = x;//栈顶指针加1后将x入栈
}
//出栈
DataType Pop(SeqStack *S)
{
if(StackEmpty(S))
{
printf("Stack underflow");//下溢,退出运行
exit(0);
}
return S->data[S->top--];//栈顶元素返回后将栈顶指针减1
}
//进制转换函数
void MultiBaseOutput(int N,int B)
{//假设N是非负的十进制数,输出等值的B进制数
int i;
SeqStack S;
InitStack(&S);
while(N)
{
Push(&S,N%B);
N = N/B;
}
while(!StackEmpty(&S))//栈非空时退栈输出
{
i = Pop(&S);
printf("%d",i);
}
}
int main()
{
MultiBaseOutput(13,2);
return 0;
}
运行截图