/*********************************************************************************
此代码用顺序栈实现非负十进制整数数制转换。
数制转换思路:对十进制的整数 N ,N%2结果放入栈中 N/2结果作为循环判断条件 N==0循环终止
********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 30 //栈中元素最大个数 溢出报错
typedef struct {
int data[MaxSize];
int top; //栈顶指针 始终指向栈顶
}SqStack;
//栈的初始化
void InitStack(SqStack &S){
S.top = -1;
}
//判空
bool EmptyStack(SqStack &S){
if(S.top == -1)
return true;
else
return false;
}
//判断栈满
bool FallStack(SqStack &S){
if(S.top == MaxSize-1)
return true;
else
return false;
}
//进栈
void Push(SqStack &S, int x){
//if(S.top = MaxSize-1)
// return false;
S.top = S.top + 1;
S.data[S.top] = x;
//return true;
}
//出栈
void Pop(SqStack &S,int &x){
//if(S.top == -1)
// return false;
x = S.data[S.top];
S.top = S.top - 1;
//return true;
}
//十进制转二进制
void TenConvertTwo(int N){
SqStack S;
InitStack(S);
int e;
int flag=0; //栈满标志位 为1说明栈满
while(N){ //当N不为0时
if(FallStack(S)){ //注意 先判断栈满不满 再执行Push操作
N=0;flag=1; //栈满 强制停止 置标志位为1
printf("栈满,无法求出二进制,请输入合法数据\n");
}
Push(S,N%2); //除2所得余数按逆序排列便是二进制
N=N/2;
}
if(flag == 0){
printf("输入数据的二进制是:");
while(!EmptyStack(S)){
Pop(S,e);
printf("%d",e);
}
printf("\n");
}
}
//十进制转八进制
void TenConvertEight(int N){
SqStack S;
InitStack(S);
int e;
int flag=0;
while(N){
if(FallStack(S)){
N=0;flag=1;
printf("栈满,无法求出八进制,请输入合法数据\n");
}
Push(S,N%8); //除8所得余数按逆序排列便是八进制
N=N/8;
}
if(flag == 0){
printf("输入数据的八进制是:");
while(!EmptyStack(S)){
Pop(S,e);
printf("%d",e);
}
printf("\n");
}
}
//十进制转十六进制
void TenConvertSixteen(int N){
SqStack S;
InitStack(S);
int e;
int flag=0;
while(N){
if(FallStack(S)){
N=0;flag=1;
printf("栈满,无法求出十六进制,请输入合法数据\n");
}
if(N%16<=9)
Push(S,N%16);
else
switch(N%16){
case 10:Push(S,'A');break;
case 11:Push(S,'B');break;
case 12:Push(S,'C');break;
case 13:Push(S,'D');break;
case 14:Push(S,'E');break;
case 15:Push(S,'F');break;
}
N=N/16;
}
if(flag == 0){
printf("输入数据的十六进制是:");
while(!EmptyStack(S)){
Pop(S,e);
if(e>64&&e<71)
printf("%c",e);
else printf("%d",e);
}
printf("\n");
}
}
int main(){
int e=0; //输入的值
printf("请输入一个十进制非负整数:");
scanf("%d",&e);
TenConvertTwo(e);
TenConvertEight(e);
TenConvertSixteen(e); //事实上可以用%x直接打印出一个数的十六进制
}