利用栈结构,实现将任意的十进制整数N转成r(2≤r≤16)进制并输出。
#include <stdio.h>
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
#define MAXSIZE 100
typedef int SElemType;
typedef struct{
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//栈可用的最大容量
}SqStack;
//栈的初始化
Status InitStack(SqStack &S)
{
//构造一个空栈
S.base=new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!S.base)//存储分配失败
exit (OVERFLOW);
S.top=S.base;//top初始为base,空栈
S.stacksize=MAXSIZE;
return OK;
}
//判断栈空
Status StackElemType(SqStack S)
{
return (S.base==S.top);
}
//出栈
Status Pop(SqStack &S,SElemType &e)
{
//删除栈顶元素,用e返回其值
if(S.top==S.base)
return ERROR;
else
{
e=*--S.top;
return OK;
}
}
//入栈
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)//栈满
return ERROR;
else
{
*S.top++=e; //元素e压入栈顶,栈顶指针加一
return OK;
}
}
//将十进制整数N转换为r进制数
Status conversion(int N,int r)
{
SElemType e;
SqStack S;
if(N<=0||r<=0)
return ERROR ;
cout<<"\n ("<<N<<")10 = ";
InitStack(S);
while(N)
{
Push(S,N%r);
N/=r;
}
cout<<"( ";
while(!(StackElemType(S)))
{
Pop(S,e);
if(e>=0&&e<10)
{
printf("%d",e);
}
else
{
printf("%c",'A'+e-10);
}
}
cout<<")"<<r<<"\n";
return OK;
}
int main()
{
int N,r;
char yn;
do{
cout<<"\n\n===================================";
cout<<"\n 将十进制整数N转换为r进制数 ";
cout<<"\n===================================";
cout<<"\n输入十进制数N=";
cin>>N;
cout<<"输入转换数制r=";
cin>>r;
if(conversion(N,r)==ERROR)
{
cout<<"\n输入有误!";
}
else
cout<<"\n转换成功!";
cout<<"\n\n===================================";
cout<<"\n继续吗?(Y/N):";
cin>>yn;
}while(yn=='Y'||yn=='y');
return 0;
}