封装一个函数,将十进制分别转换成二进制、八进制以及十六进制
代码思路:使用数据结构-------->栈
//进制转换
void stack_numchange(seqStack *s,int num,int n){
if(NULL==s){
printf("所给栈不合法\n");
return;
}
int temp=0; //定义变量用来接收余值
switch(n){
case 2:
while(num!=0){ //使用除二取余法求出二进制数
temp=num%2; //取余
num=num/2; //取整
stack_push(s,temp); //将余数压入栈中
}
stack_display(s); //对栈进行遍历
while(s->top!=-1){ //弹出栈中所有数
stack_pop(s);
}
break;
case 8:
while(num!=0){ //使用除八取余法求出八进制数
temp=num%8;
num=num/8;
stack_push(s,temp);
}
stack_display(s);
while(s->top!=-1){
stack_pop(s);
}
break;
case 16:
while(num!=0){ //使用除十六取余法求出十六进制数
temp=num%16;
num=num/16;
stack_push(s,temp);
}
stack_display(s);
while(s->top!=-1){
stack_pop(s);
}
break;
}
}
运行结果:
主函数代码:
#include <stdio.h>
#include "stack.h"
int main(int argc, const char *argv[])
{
seqStack *s=stack_create();
if(NULL==s){
printf("创建失败\n");
return 0;
}
printf("二进制如下:\n");
stack_numchange(s,75,2);
putchar(10);
printf("八进制如下:\n");
stack_numchange(s,75,8);
putchar(10);
printf("十六进制如下:\n");
stack_numchange(s,75,16);
putchar(10);
return 0;
}
定义函数的代码:
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
//创建
seqStack *stack_create(){
seqStack *s=(seqStack *)malloc(sizeof(seqStack));
if(NULL==s){
printf("创建失败\n");
return NULL;
}
//初始化
s->top=-1;
printf("创建成功\n");
return s;
}
//判空
int stack_empty(seqStack *s){
return s->top==-1;
}
//判满
int stack_full(seqStack *s){
return s->top==MAX-1;
}
//入栈
void stack_push(seqStack *s,datatype e){
if(NULL==s || stack_full(s)){
printf("入栈失败\n");
return;
}
//先加后压
//++s->top; //先加
//s->data[s->top]=e; //后压
s->data[++s->top]=e;
//printf("入栈成功\n");
}
//遍历
void stack_display(seqStack *s){
if(NULL==s || stack_empty(s)){
printf("遍历失败\n");
return;
}
printf("栈中从栈顶到栈底的元素分别是:\n");
for(int i=s->top;i>=0;i--){
printf("%d\t",s->data[i]);
}
putchar(10);
}
//出栈、弹栈
void stack_pop(seqStack *s){
if(NULL==s || stack_empty(s)){
printf("出栈失败\n");
return;
}
//先弹后减
printf("%d出栈成功\n",s->data[s->top]);
s->top--;
}
//栈的容量
int stack_size(seqStack *s){
return s->top+1;
}
//返回栈顶元素
datatype stack_top(seqStack *s){
if(NULL==s || stack_empty(s)){
printf("获取失败\n");
return 0;
}
return s->data[s->top];
}
//进制转换
void stack_numchange(seqStack *s,int num,int n){
if(NULL==s){
printf("所给栈不合法\n");
return;
}
int temp=0; //定义变量用来接收余值
switch(n){
case 2:
while(num!=0){ //使用除二取余法求出二进制数
temp=num%2; //取余
num=num/2; //取整
stack_push(s,temp); //将余数压入栈中
}
stack_display(s); //对栈进行遍历
while(s->top!=-1){ //弹出栈中所有数
stack_pop(s);
}
break;
case 8:
while(num!=0){ //使用除八取余法求出八进制数
temp=num%8;
num=num/8;
stack_push(s,temp);
}
stack_display(s);
while(s->top!=-1){
stack_pop(s);
}
break;
case 16:
while(num!=0){ //使用除十六取余法求出十六进制数
temp=num%16;
num=num/16;
stack_push(s,temp);
}
stack_display(s);
while(s->top!=-1){
stack_pop(s);
}
break;
}
}
头文件代码:
#ifndef __STACK_H__
#define __STACK_H__
#define MAX 20
typedef int datatype;
typedef struct
{
datatype data[MAX]; //存储栈的数组
int top; //记录栈顶元素所在的下标
}seqStack;
//创建
seqStack *stack_create();
//判空
int stack_empty(seqStack *s);
//判满
int stack_full(seqStack *s);
//入栈
void stack_push(seqStack *s,datatype e);
//遍历
void stack_display(seqStack *s);
//出栈
void stack_pop(seqStack *s);
//栈的容量
int stack_size(seqStack *s);
//返回栈顶元素
datatype stack_top(seqStack *s);
//进制转换
void stack_numchange(seqStack *s,int num,int n);
#endif
Makefile:
TARGET:=a.out
OBJS:=stack.o main.o
CC:=gcc
CFLAGS:=-o
CFLAGSs:=-c -o
$(TARGET):$(OBJS)
$(CC) $(OBJS) $(CFLAGS) $(TARGET)
%.o:%.c
$(CC) $*.c $(CFLAGSs) $*.o
.PHONY:clean
clean:
rm *.o a.out