一.内容:将十进制整数num 转换为r进制数,其转换方法为辗转相除法。要求用链栈实现 。
步骤:
- 算法设计
- Push()实现入栈;
- Empty()实现栈的空栈判断;
- Pop()实现出栈;
- Convert()实现数制转换
程序运行流程图如下: - 完整代码
#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct node{
datatype data;
struct node *next; //声明链栈
}*linkstack;
int Push(linkstack* ,datatype );
int Empty(linkstack );
int Pop(linkstack* ,datatype* );
void Convert(int ,int );
int main(void){
int num,mode; //定义整型变量 数num 和转换的进制 mode
printf("\n请输入要转换的数: ");
scanf("%d",&num);
printf("\n请输入要转换的进制:");
scanf("%d",&mode);
Convert(num,mode);
return 0;
}
//入栈
int Push(linkstack* top,datatype x) { //插入数据元素x
linkstack s=(linkstack)malloc(sizeof(struct node)); //申请内存
if(s == NULL)
return 0;
s->data=x;
s->next=(*top); //s 成为栈顶
(*top)=s;
return 1;
}
//判空
int Empty(linkstack top){
if(top == NULL)
return 1;
return 0;
}
//出栈,逐个输出余数
int Pop(linkstack* top,datatype* x){
if(top != NULL){ //如果栈没空,就输出一个余数,直到空栈
linkstack p=(*top);
(*x)=(*top)->data;
(*top)=(*top)->next;
free§;
return 1;
}
return 0;
}
//转换,将十进制整数转换为任意进制数
void Convert(int num,int mode){
int h; //定义 h 表余数
linkstack top = NULL;
printf("转换结果为: ");
if(num>0){
while(num != 0){
h=num%mode;
Push(&top,h); //辗转相除,把余数压入栈
num=num/mode;
}
while(!Empty(top)){ //如果不是空栈,
Pop(&top,&h);
printf("%d",h);
}
printf("\n");
}
else if(num<0){
printf("-"); //如果num是负数,将其取正数,输出时在它前面输出一个负号
num=num*(-1);
while(num != 0){
h=num%mode;
Push(&top,h);
num=num/mode;
}
while(!Empty(top)){
Pop(&top,&h);
printf("%d",h);
}
printf("\n");
}
else
printf("%d\n",0); //如果是零,输出零
}
- 测试结果