#include<stdio.h>
#include<stdlib.h>
#define STACT_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 100 //存储空间分配增量
typedef struct
{
int *base; //栈底指针
int *top; //栈顶指针
int stacksize; //当前已分配的存储空间。
}SqStack;
//函数原型:
int InitStack(SqStack &s); //构建空栈函数
int Calculation (SqStack &s,int n,int r); //计算进制函数
int Push(SqStack &s,int m); //元素入栈函数
int StackEmpty(SqStack &s); //判断空栈函数
int Pop(SqStack &s); //元素出栈函数
//*************主函数**************
int main()
{
int n;
SqStack s;
InitStack(s); //构造空栈
printf("请输入一个整数:");
scanf("%d",&n);
if(n<0)
{
printf("请输入一个大于0的整数!\n");
exit(0);
}
//调用计算进制函数,分别将2,8,16作为函数参数
printf(" 二进制 : "); Calculation (s,n,2);
printf(" 八进制 : "); Calculation (s,n,8);
printf("十六进制 : "); Calculation (s,n,16);
return 0;
}
//**********构造空栈函数************
int InitStack(SqStack &s)
{
//请求分配STACT_INIT_SIZE个int类型的空间来作为栈;
s.base=(int*)malloc(STACT_INIT_SIZE*sizeof(int));
if(!s.base) exit(0); //判断申请空间内存是否成功;
s.top=s.base; //将栈顶指针也指向栈底指针,表示空栈;
//将申请分配的栈当前的空间个数存进s.stacksize
s.stacksize=STACT_INIT_SIZE;
return 1;
}
//**********计算进制函数************
int Calculation (SqStack &s,int n,int r)
{
int m;
while(n)
{
Push(s,n%r); //把n除r的余数压入s栈底
n=n/r;
}
while(!StackEmpty(s))
{
m=Pop(s);
if(r==16)
{
if(m==10) printf("A");
else if(m==11) printf("B");
else if(m==12) printf("C");
else if(m==13) printf("D");
else if(m==14) printf("E");
else if(m==15) printf("F");
else printf("%d",m);
}
else printf("%d",m);
}
printf("\n");
return 1;
}
//************元素入栈函数***********
int Push(SqStack &s,int m)
{
int *new_p=NULL;
if(!s.base) exit(0); //判断栈是否存在
//判断是否没有内存来存新元素;
//若是内存不顾就用realloc()函数重新申请内存;
//将新分配的内存地址放在new_p中,若申请成功再将new_p赋给栈底指针;
//避免原来的栈底指针丢失;
if(s.base-s.top>=STACKINCREMENT)
{
new_p=(int *)realloc(s.base,(STACT_INIT_SIZE+STACKINCREMENT)*sizeof(int));
if(!new_p)
{
printf("重新申请内存分配失败!");
exit(0);
}
s.base=new_p;
s.top=s.base+STACKINCREMENT; //用首地址加偏移量找到栈顶指针;
s.stacksize+=STACT_INIT_SIZE;//更新栈空间的大小;
}
*s.top=m; //将新元素压进栈顶;
s.top++; //栈顶指针往上移;
return 0;
}
//************元素出栈函数***********
int Pop(SqStack &s)
{
int m;
if(!s.base) exit(0); //判断栈是否存在;
if(s.top==s.base) //判断是否是空栈
{
printf("栈已经为空了\n");
exit(0);
}
s.top--; //让栈顶指针指向栈中最后一个元素
m=*s.top; //把栈中最后一个元素存进m中;
return m;
}
//************判断空栈函数***********
int StackEmpty(SqStack &s)
{
//当栈底指针与栈顶指针指向一处时表示空栈;
if(s.base==s.top)
return 1;
else return 0;
}