数据结构——进制转换

#include<stdio.h>
#include<stdlib.h>

#define STACT_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 100  //存储空间分配增量

typedef struct 
{
	int *base;      //栈底指针
	int *top;       //栈顶指针
	int stacksize;  //当前已分配的存储空间。
}SqStack;

//函数原型:
int InitStack(SqStack &s);                   //构建空栈函数
int Calculation (SqStack &s,int n,int r);    //计算进制函数
int Push(SqStack &s,int m);                  //元素入栈函数
int StackEmpty(SqStack &s);                  //判断空栈函数
int Pop(SqStack &s);                         //元素出栈函数

//*************主函数**************
int main()
{
	int n;
	SqStack s;      
	InitStack(s);     //构造空栈
	printf("请输入一个整数:");
	scanf("%d",&n);
	if(n<0)
	{
		printf("请输入一个大于0的整数!\n");
		exit(0);
	}
	//调用计算进制函数,分别将2,8,16作为函数参数
    printf("  二进制 : ");	  Calculation (s,n,2);
	printf("  八进制 : ");    Calculation (s,n,8);
	printf("十六进制 : ");    Calculation (s,n,16);
	return 0;
}


//**********构造空栈函数************
int InitStack(SqStack &s)
{
	//请求分配STACT_INIT_SIZE个int类型的空间来作为栈;
	s.base=(int*)malloc(STACT_INIT_SIZE*sizeof(int));
	if(!s.base) exit(0);  //判断申请空间内存是否成功;
	s.top=s.base;          //将栈顶指针也指向栈底指针,表示空栈;
	//将申请分配的栈当前的空间个数存进s.stacksize
	s.stacksize=STACT_INIT_SIZE;   
	return 1;
}


//**********计算进制函数************
int Calculation (SqStack &s,int n,int r)
{
	int m;
	while(n)
	{
		Push(s,n%r); //把n除r的余数压入s栈底
		n=n/r;       
	}
	while(!StackEmpty(s))
	{
		m=Pop(s);
		if(r==16)
		{
		   if(m==10) printf("A");
		   else if(m==11) printf("B");
		   else if(m==12) printf("C");
		   else if(m==13) printf("D");
		   else if(m==14) printf("E");
		   else if(m==15) printf("F");
		   else printf("%d",m);
		}
	    else printf("%d",m);
	}
	printf("\n");
	return 1;
}

//************元素入栈函数***********
int Push(SqStack &s,int m)
{
	int *new_p=NULL;	
	if(!s.base) exit(0); //判断栈是否存在
	//判断是否没有内存来存新元素;
	//若是内存不顾就用realloc()函数重新申请内存;
	//将新分配的内存地址放在new_p中,若申请成功再将new_p赋给栈底指针;
	//避免原来的栈底指针丢失;
	if(s.base-s.top>=STACKINCREMENT)  
	{
	    new_p=(int *)realloc(s.base,(STACT_INIT_SIZE+STACKINCREMENT)*sizeof(int));
		if(!new_p)
		{
			printf("重新申请内存分配失败!");
			exit(0);
		}
	    s.base=new_p;
		s.top=s.base+STACKINCREMENT; //用首地址加偏移量找到栈顶指针;
		s.stacksize+=STACT_INIT_SIZE;//更新栈空间的大小;
	}
	*s.top=m; //将新元素压进栈顶;
	s.top++;  //栈顶指针往上移;
    return 0;
}

//************元素出栈函数***********
int Pop(SqStack &s)
{
	int m;
	if(!s.base) exit(0); //判断栈是否存在;
	if(s.top==s.base)    //判断是否是空栈
	{
		printf("栈已经为空了\n");
		exit(0);
	}
	s.top--;   //让栈顶指针指向栈中最后一个元素
	m=*s.top;  //把栈中最后一个元素存进m中;
	return m;
}



//************判断空栈函数***********
int  StackEmpty(SqStack &s)
{
	//当栈底指针与栈顶指针指向一处时表示空栈;
	if(s.base==s.top)
	return 1;
	else return 0;
}

 

### 使用栈数据结构实现不同进制之间转换 #### 实现思路 为了实现不同进制间的转换,可以利用栈这一线性表的特点——先进后出(LIFO)。对于给定的一个十进制数转为其他进制的过程如下: - 将该数值不断除以目标进制底数; - 记录每次运算所得的余数并压入栈中; - 当商变为零时停止循环操作; - 接着按照顺序弹出栈内元素形成新的进制表示。 这种方法适用于二进制、八进制以及十六进制等任意正整数基底下的转换过程[^1]。 #### C语言代码示例:十进制到二进制/八进制/十六进制转换 下面给出一段完整的C程序用于展示如何通过栈完成从十进制向其它三种常见进制形式转变的功能。这里定义了一个简单的`Stack`结构体来模拟栈的行为,并实现了基本的操作函数如初始化、推入、弹出等。 ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 typedef struct { char items[MAX_SIZE]; int top; } Stack; void init_stack(Stack *s) { s->top = -1; } int is_empty(const Stack *s) { return s->top == -1; } void push(Stack *s, char item) { if (s->top >= MAX_SIZE - 1) exit(EXIT_FAILURE); s->items[++(s->top)] = item; } char pop(Stack *s) { if (is_empty(s)) exit(EXIT_FAILURE); return s->items[(s->top)--]; } // Function to convert decimal number n into base b using stack. void dec_to_base(int n, int b) { const char digits[] = "0123456789ABCDEF"; Stack s; init_stack(&s); while (n != 0) { push(&s, digits[n % b]); n /= b; } // If the input was zero we need at least one digit '0'. if (is_empty(&s)) printf("0"); while (!is_empty(&s)) putchar(pop(&s)); putchar('\n'); } ``` 此段代码展示了如何创建一个基于数组的简单栈类及其成员方法;并通过调用`dec_to_base()`函数接受两个参数分别为要转化成的目标进制和原始十进制值来进行具体的计算工作[^2]。 例如,如果想要把数字`9`转化为其对应的二进制表达,则只需执行命令 `dec_to_base(9, 2)` 即可获得预期的结果字符串 `"1001"` 。同理也可以用来处理更复杂的场景比如将较大范围内的整型变量转变为相应的八进制或十六进制编码方式[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值