C语言笔记12--利用栈输出一个数的二进制

栈的特性是”先进后出”,先进去的会压在栈底,最后再被调用。求一个数的二进制时,与2取模后,从下往上取出0和1。这符合栈的特性,可以创建一个数组来储存0和1。
分析:先判断输入的是整数还是负数,负数在内存中是以补码形式储存,所以要另外进行处理。负数补码:最高位为符号位,除了符号位外取反+1。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define N 32//位数
struct Mystruct{
    int top;//栈顶
    int a[N];
};
struct Mystruct mystack={-1,{0}};//初始化,-1代表是空
int isEmpty()
{
    if (mystack.top == -1)
    {
        return 0;//空返回0
    }
    else
    {
        return 1;
    }   
}
//把数据压入栈
int push(num)
{
    if (mystack.top == N - 1)//判断是否溢出
    {
        return 0;
    }
    else
    {
        mystack.top += 1;
        mystack.a[mystack.top] = num;
    }
    return 1;
}
//取出数据
int pop()
{
    mystack.top -= 1;
    return mystack.a[mystack.top + 1];
}
//对负数进行特别处理
void fushu()
{
    mystack.top = 31;
    mystack.a[mystack.top] = 1;//符号位
    for (int i = mystack.top-1; i >= 0; i--)//取反
    {
        if (mystack.a[i] == 1)
        {
            mystack.a[i] = 0;
        }
        else
        {
            mystack.a[i] = 1;
        }
    }
    mystack.a[0] += 1;//+1
    for (int j = 0; j < mystack.top - 1; j++)
    {
        if (mystack.a[j] == 2)//满2进1
        {
            mystack.a[j] = 0;
            mystack.a[j + 1] += 1;
        }
    }
    mystack.a[mystack.top] = 1;
}
void main()
{   printf("请输入一个数:");
    int num;
    scanf("%d", &num);
    if (num>0)
    { 
        while (num)//传入数据
        {
            push(num % 2);
            num /= 2;
        }
        while (isEmpty())//非空返回1
        {
            printf("%d", pop());
        }
    }
    else if (num == 0)
    {
        printf("%d", num);
    }
    else//小于0
    {
        num *= -1;
        while (num)
        {
            push(num % 2);
            num /= 2;
        }
        fushu();
        while (isEmpty())//非空返回1
        {
            printf("%d", pop());
        }
    }
    system("pause");
}

正数的输出
这里写图片描述
负数输出为反码
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40850689/article/details/82503210
今日推荐