一、 功能
利用栈 实现 10进制数转换 二进制数的 功能。
输入 十进制数 35
输出 二进制的表示形式 100011
二、代码说明
1> 利用栈 先进后出 来实现功能。
2> 采用了链式栈的创建、头插链式栈、头删链式栈、清空链式栈、销毁链式栈等。
3> 利用十进制转二进制的方法,将十进制除以2,取余数。将余数一个个头插进链式栈。
4> 将链式栈中的数据出链式栈,就得到了二进制数。
三、程序代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Node{
int data;
struct _Node *next;
}node_t;
typedef struct _Stack{
unsigned int count;
node_t *top;
}stack_t;
//创建链式栈
int create_stack(stack_t **my_stack){
if(NULL == my_stack){
printf("入参为NULL 请检查\n");
return -1;
}
*my_stack = (stack_t *)malloc(sizeof(stack_t));
if(NULL == *my_stack){
printf("内存分配是失败\n");
exit(-1);
}
(*my_stack)->count = 0;
(*my_stack)->top = NULL;
return 0;
}
//入栈
int push_stack_by_tail(stack_t *my_stack, int sum){
if(NULL == my_stack){
printf("入参为NULL, 请检查\n");
exit(-1);
}
//创建新的 数据节点
node_t* pnew = (node_t *)malloc(sizeof(node_t));
if(NULL == pnew){
printf("内存分配为NULL, 请检查\n");
exit(-1);
}
pnew->data = sum;
pnew->next = NULL;
//将新节点头插到链表中
pnew->next = my_stack->top;
my_stack->top = pnew;
my_stack->count++;
return 0;
}
//判断栈是否为空 返回1 空 返回0 非空
int is_empty(stack_t *my_stack){
if(NULL == my_stack){
printf("入参为NULL, 请检查\n");
return -1;
}
return my_stack->top == NULL? 1 : 0;
}
//出栈
int pop_stack(stack_t *my_stack,int *sum){
if(NULL == my_stack){
printf("入参为NULL, 请检查\n");
exit(-1);
}
if(is_empty(my_stack)){
printf("栈为空,出栈失败\n");
return -1;
}
node_t *pdel = NULL;
while(my_stack->top != NULL){
pdel = my_stack->top;
//数据出栈
*sum = my_stack->top->data;
printf("%d ",*sum);
my_stack->top = pdel->next;
free(pdel);
}
pdel = NULL;
my_stack->count = 0;
return *sum;
}
//清空栈
int clean_stack(stack_t *my_stack){
if(NULL == my_stack){
printf("入参为NULL, 请检查\n");
return -1;
}
node_t *pdel = NULL;
//循环头删 删除所有的数据节点
while(NULL != my_stack->top){
pdel = my_stack->top;
my_stack->top = pdel->next;
free(pdel);
}
pdel = NULL;
//个数清零
my_stack->count = 0;
return 0;
}
//销毁栈
int destroy_stack(stack_t **my_stack){
if(NULL == *my_stack || NULL == my_stack){
printf("入参为NULL, 请检查\n");
return -1;
}
//先调用清空
clean_stack(*my_stack);
free(*my_stack);
*my_stack = NULL;
return 0;
}
int main(){
int num = 0;
stack_t *my_stack = NULL;
//创建栈
create_stack(&my_stack);
printf("输入十进制数:");
scanf("%d",&num);
//除2取余数 将余数入栈
while(num != 0){
push_stack_by_tail(my_stack, num%2);
num = num / 2;
}
//数据出栈
int sum = 0;
pop_stack(my_stack,&sum);
printf("\n");
//销毁栈
destroy_stack(&my_stack);
return 0;
}