将十进制转换成二进制,八进制,十六进制(C语言,栈实现)

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include<string.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef int ElemType;
typedef int Status;

typedef struct {
	ElemType* base;
	ElemType* top;
	int stacksize;
}SqStack;

Status Pop(SqStack* S);

void InitStack(SqStack* S) {          //创建空栈
	S->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
	S->top = S->base;
	S->stacksize = STACK_INIT_SIZE;   //当前内存大小
}

Status Pop(SqStack* S) {               //用e返回栈顶元素,并且删除栈顶元素
	if (S->top == S->base) return 0;
	char e = *--S->top;
	return e;
}

void PrintStack(SqStack* S) {         //输出栈中所有元素,并清空栈
	while (S->top != S->base) {
		int c = Pop(S);               //S已经是指针,不需要取地址了
		if (c < 10)
			printf("%d", c);
		else
			printf("%c", c);
	}
}

void  Push(SqStack* S, char e) {       //栈顶插入元素
	if (S->top - S->base >= S->stacksize) {
		S->base = (ElemType*)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(ElemType));  //重新为S->base分配内存
		S->top = S->base + S->stacksize;
		S->stacksize += STACKINCREMENT;
	}
	*S->top++ = e;                    //相当于*S->top=e; S->top++;
}


int main() {
	int i, j, temp, end = 0;
	SqStack S;
	InitStack(&S);
	int number;
	scanf("%d", &number);
	int x = number, y = number, z = number;

	while (x) {                  //转换成二进制
		temp = x % 2;
		x = x / 2;
		Push(&S, temp);
	}
	PrintStack(&S);
	printf("\n");

	while (y) {                 //转换成八进制
		temp = y % 8;
		y = y / 8;
		Push(&S, temp);
	}
	PrintStack(&S);
	printf("\n");
	 
	while (z) {                //转换成十六进制
		temp = z % 16;
		int temp1;
		char temp2;
		z = z / 16;
		if (temp == 10) {
			temp2 = 'A';
			Push(&S, temp2);
		}
		else if (temp == 11) {
			temp2 = 'B';
			Push(&S, temp2);
		}
		else if (temp == 12) {
			temp2 = 'C';
			Push(&S, temp2);
		}
		else if (temp == 13) {
			temp2 = 'D';
			Push(&S, temp2);
		}
		else if (temp == 14) {
			temp2 = 'E';
			Push(&S, temp2);
		}
		else if (temp == 15) {
			temp2 = 'F';
			Push(&S, temp2);
		}
		else {
			temp1 = temp;
			Push(&S, temp1);
		}
	}
	PrintStack(&S);
	return 0;
}

输入:666

输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值