C语言利用堆栈实现十进制和二进制的互相转化

⌚Time: 2022-10-30 15:19:16

👨‍💻Author: Jack Ge

1.十进制转二进制

将余数从下向上倒序写就是结果

例如302

302 2 = 151 余0

151 2 = 75 余1

75 2 = 37 余1

37 2 = 18 余1

18 2 = 9 余0

9 2 = 4 余1

4 2 = 2 余0

2 2 = 1 余0

1 2=0 余1

故二进制为100101110

2.二进制转十进制

1*2^8+0*2^7+0*2^6+1*2^5+0*2^4+1*2^3+1*2^2+1*2^1+0*2^0=302

3.完整代码


#include<stdio.h>

#include<string.h>

#include<math.h>

#define MAX_STACK_SIZE 1024

//定义堆栈结构体

typedef struct{

    int stack[MAX_STACK_SIZE];

    int top;

}SeqStack;

//压栈函数

int push_stack(SeqStack *pStack,int data){

    if(pStack->top<MAX_STACK_SIZE){

        pStack->stack[pStack->top] = data;

        pStack->top++;

    }else{

        return -1;

    }

}

//出栈函数

int pop_stack(SeqStack *pStack){

    if(pStack->top>0){

        pStack->top--;

        return pStack->stack[pStack->top];

    }else{

        return -1;

    }

}

//新建堆栈

SeqStack get_stack(){

    SeqStack seqStack;

    int i;

    seqStack.top = 0;

    for(i=0;i<MAX_STACK_SIZE;i++){

        seqStack.stack[i] = 0;

    }

    return seqStack;

}

//十进制转二进制

void dec2bin(char *argNum){

    int iNum;

    sscanf(argNum,"%d",&iNum);

    SeqStack seqStack = get_stack();

    while(iNum){

        int mod = iNum%2;

        push_stack(&seqStack,mod);

        iNum = iNum/2;

    }

    printf("十进制转换二进制结果:");

    int num = pop_stack(&seqStack);

    while(num!=-1){

        printf("%d",num);

        num = pop_stack(&seqStack);

    }

}

//二进制转十进制

void bin2dec(char *argNum){

    SeqStack seqStack = get_stack();

    int i = 0;

    int sum = 0;

    //将所有二进制数字压栈,但是不包括结尾符号

    for(i =0;i<strlen(argNum)-1;i++){

        push_stack(&seqStack,argNum[i]-48);

    }

    for(i=0;i<strlen(argNum)-1;i++){

        int num = pop_stack(&seqStack);

        //pow(x,y)功能:计算x的y次幂

        sum = sum+num*pow(2,i);

    }

    printf("二进制转换十进制结果:%d",sum);

}

int main(){

    char chNum[1024]={0};

    int length;

    printf("输入要转换的数值:");

    scanf("%s",&chNum);

    length = strlen(chNum);

    //最后以 '$'结束代表输入的十进制数字,以'#'结束代表输入的二进制数字

    switch(chNum[length-1]){

    case '$':

    {

        dec2bin(chNum);

        break;

    }

    case '#':

    {

        bin2dec(chNum);

        break;

    }

    }

    return 0;

}