//c语言版数据结构(奇迹冬瓜)-栈实战(2)整数进制转换<10进制到2,8,16进制>
/*
初始化栈
输入要转换的进制并进行判断是否在制定进制内
输入要转换的整数并判断改整数是否大于零
循环当整数不为零的时候
{
先对该整数求余(选择的进制)
余数进栈
在对该整数求除(选择的进制)
}
循环当栈不为空
{
出栈
}
*/
//---------头文件----------
#include<stdio.h>
#include<stdlib.h>
//---------宏定义----------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE 1
#define ERROR 0
#define OVERFLOW -2
//---------替换和结构体-----------
typedef int Bool;
typedef struct
{
int *base,*top;
int stacksize;
}SqStack,*Stack;
//--------函数列表--------
Bool InitStack(Stack s);
Bool StackEmpty(Stack s);
Bool Push(Stack s,int e);
Bool Pop(Stack s,int *e);
//--------主函数---------
void main()
{
SqStack sq,*s=&sq;
int n,integer,e,flag=1;
InitStack(s);
while(flag)
{
printf("输入要转换的进制:(2,8or16):");
do
{
scanf("%d",&n);
if(2!=n&&8!=n&&16!=n)
{
printf("输入转换进制错误!重新输入.\n");
}
}while(2!=n&&8!=n&&16!=n);
printf("输入要转换的十进制整数(integer>0):");
do
{
scanf("%d",&integer);
if(integer<=0)
{
printf("输入整数错误!重新输入.\n");
}
}while(integer<=0);
while(integer)
{
Push(s,integer%n);
integer/=n;
}
printf("转换后的结果:");
while(!StackEmpty(s))
{
Pop(s,&e);
e=e>=10?e+87:e+48;
printf("%c",e);
}
printf("\n");
printf("(退出0&&继续1):");
do
{
scanf("%d",&flag);
if(0!=flag&&1!=flag)
{
printf("输入错误!重新输入.\n");
}
}while(0!=flag&&1!=flag);
printf("\n");
}
//free(s);
getchar();
getchar();
}
//--------其余函数--------
Bool InitStack(Stack s)
{
if(!(s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int))))
{
exit(OVERFLOW);
}
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return TRUE;
}
Bool StackEmpty(Stack s)
{
return s->base==s->top?TRUE:ERROR;
}
Bool Push(Stack s,int e)
{
if(s->top-s->base>=s->stacksize)
{
if(!(s->base=(int *)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(int))))
{
exit(OVERFLOW);
}
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*(s->top++)=e;
return TRUE;
}
Bool Pop(Stack s,int *e)
{
if(s->base==s->top)
{
return ERROR;
}
*e=*(--s->top);
return TRUE;
}