数据结构:采用链式栈实现十进制转二进制输出,代码详细

一、 功能

利用栈 实现 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;
}
  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值