栈的结构体,实现数制转换
//有很多问题,我只想问下栈的函数实现中形参调用怎么总失败,请大家多多帮助,谢谢了//完成一个非负十进制小数数转换为2、8、16进制
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void conversion(int p,float x); //数值转换函数
float Xiao(float x); //取小数
#define OVERFLOW 0 //定义栈
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
float *base;
float *top;
int stacksize;
}SqStack;
int InitStack(SqStack &S) //构造空栈
{
S.base =(float *)malloc(STACK_INIT_SIZE * sizeof(float));
if(!S.base)
exit(OVERFLOW);
S.top = S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
int StackEmpty(SqStack &S) //判断栈非空
{
if(S.top==S.base)
return error;
}
int Push(SqStack &S,flaot e) //插入e为栈顶元素
{
if(S.top-S.base>=S.stacksize){
S.base=(float *)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(float));
if(!S.base)
exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=10;
}
*S.top++=e;
return OK;
}
int Pop(SqStack &S,float &e) //取出栈顶
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
void main() //主程序
{
int p;float x;
printf("请输入想要转换到的进制:(2、8或16)"); //选择转换到的进制
scanf("%d",&p);
if(p!=2&&p!=8&&p!=16)
printf("无法进行这种转换!\n");
printf("请输入想要转换的数据:(大于0的十进制树)"); //输入要处理的数据
scanf("%f",&x);
if(x<0)
printf("输入数据错误!\n");
else
conversion(p,x);
}
float Xiao(float x) //取小数
{
return(x-int(x));
}
void conversion(int p,float x) //数值转换为p进制,数据为x
{
int n;float m;
InitStack(S);InitStack(T);
n=int(x);m=Xiao(x);
while(n) //整数部分送入栈S
{
Push(S,n%p);
n=n/p;
}
while(m) //小树部分送入栈T
{
Push(T,Zheng(m*p));
m=Xiao(m*p);
}
while(!StackEmpaty(S)) //输出整数部分
{
Pop(S,e);
if(e<10)
printf("%d",e);
else
printf("%c",e+55); //十六进制输出字母
}
printf("."); //输出小数点
for(int i=3;i>0;i--) //输出小数部分
{
Pop(T.e);
if(e<10)
printf("%d",e);
else
printf("%c",e+55);
}
printf("\n");
}