栈的特性是”先进后出”,先进去的会压在栈底,最后再被调用。求一个数的二进制时,与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");
}
正数的输出
负数输出为反码