数制转换(C语言实现)

#include<stdio.h>
#include<stdlib.h> 
typedef int SElemType ;
unsigned n;//非负整数
int N;
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#define STACKINCREMENT 1
#define STACK_INIT_SIZE 10
typedef int Status;
typedef struct{
 SElemType *base;
 SElemType *top;
 int stacksize;
}SqStack;

//此处需引入顺序栈存储结构及其基本操作

Status InitStack(SqStack &S)
{
 //为栈分配一个指定大小的存储空间
 S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
 if(!S.base)
  return ERROR;//存储分配失败
 S.top=S.base;//栈底与栈顶相同表示一个空栈
 S.stacksize=STACK_INIT_SIZE;
 return OK;
}
Status StackEmpty(SqStack S)
{
 //若栈S为空栈(栈顶与栈底相同),则返回OK,否则返回ERROR
 if(S.top==S.base)
  return OK;
 else
  return ERROR;
}
Status Push(SqStack &S,SElemType e)
{
 //插入元素e为新的栈顶元素
 if(S.top-S.base>=S.stacksize)//栈满,追加存储空间
 {
  S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
  if(!S.base)
   return ERROR;
  S.top=S.base+S.stacksize;
  S.stacksize+=STACKINCREMENT;
 }
 *S.top++=e;//这个等式的++*优先级相同,但是它们的运算方式,是自右向左
 return OK;
}
Status GetTop(SqStack S,SElemType *e)
{
 if(S.base<S.top)
 {
  *e=*(S.top-1);
  return OK;
 }
 else return ERROR;
}
Status Pop(SqStack &S,SElemType &b)
{
 //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
 if(S.top==S.base)
  return ERROR;
    b = * --S.top;//这个等式的--*优先级相同,但是它们的运算方式,是自右向左
 return OK;
}

Status StackTraverse(SqStack S,int(*visit)(SElemType))
{
while(S.top>S.base)
 {
         visit(*S.base);
   S.base++;
 
 }
 printf("\n");
 return OK;
}
Status visit(SElemType c)
{
 printf("%d", c);
 return OK;
}
void conversion()
{
  //对于输入任意一个非负十进制整数,打印输出与其等值的N进制数
 SqStack s;
 SElemType e;
 InitStack(s);//初始化栈
 
 
   
 while(n)//当n不等于0
 {
  Push(s,n%N);//压入n除以N的余数(N进制的低位)
  n=n/N;
 }
 printf("转换后的数值为:");
 while(!StackEmpty(s))
 {
  Pop(s,e);//弹出栈顶元素且赋值给e
  printf("%d",e);
 }
 printf("\n");
}
void main()
{
 int y;
 char c;
 printf(" 1.输入一个十进制数n\n 2.输入转换的进制m\n 3.进制转换 \n 4.继续否?(y/n?)\n");
 
 while(1)
 {
  printf("请选择1-4\n");
  scanf("%d",&y);
  if(y==1)
  {
   printf("输入一个十进制数\n");
   scanf("%d", &n);
  }else 
   if(y==2)
   {
    printf("输入转换的进制\n");
    scanf("%d", &N);
   }else
    if(y==3)
    {
     printf("进制转换\n");
     conversion();
    }else
     if(y==4)
     {
      printf("请输入y or Y to continue or n or N to quit\n");
      scanf("%c",&c);
      if(c == 'n' || c == 'N')
       break;
      
     }
     else
     {
      printf("无效字符\n");
     }
 }
}

你可能感兴趣的:(数据结构,算法分析,数制转换)