问题描述
小王想利用栈设计程序完成数制的转换,但不知什么原因,转换总是有错。请帮他完成十进制非负整数到二进制的转换。
输入说明
输入3个十进制非负整数,每个数用空格分开。
输出说明
输出十进制数所对应的二进制数。
输入样例
例1:
3 19 256
输出样例
例1:
11 10011 100000000
提示:
转换方法:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
使用链栈操作,节省空间
入栈和出栈直接从书上扒的
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int element;
struct node *next;
}LinkStack;
LinkStack *Top;
//进栈
LinkStack *PushL(LinkStack *Top,int e){
LinkStack *p;
p=(LinkStack*)malloc(sizeof(LinkStack));
p->element=e;
p->next=Top;
Top=p;
return Top;
}
//出栈
int *PopL(LinkStack *Top){
int *r;
LinkStack *p=Top;
if(p==NULL){
printf("Stack is underflow\n");
return NULL;
}
else{
r=(int*)malloc(sizeof(int));
*r=p->element;
Top=Top->next;
printf("%d",*r); //输出在这里
return r;
}
}
//进制转换
void Trans(int ten) {
Top = NULL;
if(ten==0) printf("0"); //0单独考虑
else{
while (ten > 0) {
int remainder = ten % 2;
Top = PushL(Top, remainder);
ten /= 2;
}
//也是输出
while(Top != NULL) {
PopL(Top);
Top=Top->next;
}
}
printf(" ");
}
int main(){
Top = NULL;
int ten1,ten2,ten3;
scanf("%d %d %d",&ten1,&ten2,&ten3);
Trans(ten1);
Trans(ten2);
Trans(ten3);
return 0;
}
出栈里没写free(p),因为要循环操作,不止输出栈顶元素