使用顺序栈实现进制转化

本文讲述了利用C语言顺序栈实现进制转化的过程,涉及栈操作、算法应用和具体代码实现。
摘要由CSDN通过智能技术生成

在学习严蔚敏老师的数据结构之进制转化用顺序栈实现

问题思路分析

首先,在写代码之前,我们先总体梳理一下思路,要实现顺序栈的进制转化,采用数组作为储存方式,为了,便于操作栈里面的元素,我们将栈里面的指针定义成为与数组下标同数据类型,我们已知,要实现进制转化的代码,首先要知道一种进制转化实现的一种算法,一种思路,这里我们采用普遍知道的,求余实现进制转化法,那明确了基本的思路,我们就开始实现。

        首先,要使用栈这一种没有被标准c语言封装的数据类型,首先要自己定义相关的数据类型

       然后,在实现进制转化的过程中,需要初始化栈,元素入栈,元素出栈,及判断栈是否为空这几个操作,

       最后,在主函数里面依次调用对应的函数,然后将出栈的元素依次保存到一个变量里,每出栈一次,打印一次该变量,即可得到该进制转化完成的值。

代码实现

首先

     首先,要使用栈这一种没有被标准c语言封装的数据类型,首先要自己定义相关的数据类型

struct SqStack{
	int data[max];
	int top;
};

其次

然后,在实现进制转化的过程中,需要初始化栈,元素入栈,元素出栈,及判断栈是否为空这几个操作,


//初始化栈
void InitStack(SqStack *S){
	S->	top=-1;//初始时,栈顶置为-1 
}
//空栈 
bool StackEmpty(SqStack *S){
	return S->top==-1;
}

//压栈
void Push(SqStack *S,int elem){
	//判断特殊情况,栈overflow
	if(S->top==max-1){
		printf("SqStack S is overflow"); return ;
	}
	S->data[++S->top]=elem;
}

//出栈 
void Pop(SqStack *S,int *elem){
	//根据当前操作,排除特殊情况,执行正常操作,
	//特殊情况,栈空
	if(StackEmpty(S)) {
		printf("The SqStack S is empty ");
		return ;
	}
	*elem=S->data[S->top--];
}

 最后

最后,在主函数里面依次调用对应的函数,然后将出栈的元素依次保存到一个变量里,每出栈一次,打印一次该变量,即可得到该进制转化完成的值。


int main(){
	SqStack S;
	int e,N;
	//构造空栈 
	InitStack(&S);
	//输入待转化的数 
	printf("请输入要转化为八进制的数:\n"); 
	scanf("%d",&N);
	//将余数压入栈中 
	while(N){
		Push(&S,N%8);
		N=N/8;
	}
	//然后将余数依次出栈 
	while(!StackEmpty(&S)){
		Pop(&S,&e);
		printf("%d",e);
		
	}
	
}

所有代码如下,有需要的自取

#include<stdio.h>
#include<stdbool.h>

#define STACK_INIT_SIZE 100; //
#define STACKINCREMENT 10; 
 
//栈的最大储存长度 
#define max 100
//栈结构的定义
//使用数组的储存方式 

struct SqStack{
	int data[max];
	int top;
};


//初始化栈
void InitStack(SqStack *S){
	S->	top=-1;//初始时,栈顶置为-1 
}
//空栈 
bool StackEmpty(SqStack *S){
	return S->top==-1;
}

//压栈
void Push(SqStack *S,int elem){
	//判断特殊情况,栈overflow
	if(S->top==max-1){
		printf("SqStack S is overflow"); return ;
	}
	S->data[++S->top]=elem;
}

//出栈 
void Pop(SqStack *S,int *elem){
	//根据当前操作,排除特殊情况,执行正常操作,
	//特殊情况,栈空
	if(StackEmpty(S)) {
		printf("The SqStack S is empty ");
		return ;
	}
	*elem=S->data[S->top--];
}


int main(){
	SqStack S;
	int e,N;
	//构造空栈 
	InitStack(&S);
	//输入待转化的数 
	printf("请输入要转化为八进制的数:\n"); 
	scanf("%d",&N);
	//将余数压入栈中 
	while(N){
		Push(&S,N%8);
		N=N/8;
	}
	//然后将余数依次出栈 
	while(!StackEmpty(&S)){
		Pop(&S,&e);
		printf("%d",e);
		
	}
	
}

如果你有什么问题的话,请评论,我看到会及时与你解答

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,我了解您的问题。实现转二可以使用顺序来模拟,具体步骤如下: 1.将十数入。 2.用顶元素除以二,得到商和余数,余数入。 3.重复第2步,直到商为0。 4.弹出中所有元素,即为该十数的二表示。 需要注意的是,在弹出中元素时,要注意顺序,以得到正确的二表示。 希望我的回答对您有所帮助。 ### 回答2: 十转化为二的过程可以通过顺序实现。首先,我们需要创建一个空,作为二数的容器。 将十数从右往左依次除以2,将余数依次压入中,直到除完。 接下来,我们开始弹出中的元素,即从中取出元素,直到为空。将弹出的元素依次排列起来,即为十数的二表示。 举个例子,我们将十数13转化为二数。 首先,将13除以2,得到的余数为1,将1压入中。然后将13除以2,得到的商为6,再次除以2,得到余数为0,将0压入中。最后,将6除以2,得到的商为3,再次除以2,得到的余数为1,将1压入中。 现在我们开始弹出中的元素,依次为1、0、1。将它们按照弹出顺序排列起来,得到的二数表示为101。 因此,十数13转化为二数的结果是101。 以上就是使用顺序实现转化的过程。通过这种方法,我们可以将任意十转化为对应的二数。 ### 回答3: 十转化为二可以通过顺序实现。首先,我们需要明确十转换为二的原理。 在十转换为二时,我们需要不断地除以2,并将余数存入中。具体操作如下: 1. 初始化一个空的顺序。 2. 将十数除以2,并取得其余数。 3. 将余数入。 4. 将十数除以2取整,然后继续执行第2步骤,直到十数变为0. 5. 从顶开始依次弹出中的元素,即可得到二数。 下面是一个具体的例子来说明: 以十数12转化为二数为例。 1. 初始化一个空的顺序。 2. 12除以2,得到6余数0。将余数0入。 3. 6除以2,得到3余数0。将余数0入。 4. 3除以2,得到1余数1。将余数1入。 5. 1除以2,得到0余数1。将余数1入。 6. 十数变为0,停止除法运算。 7. 从顶开始弹出中的元素,得到的顺序就是12的二表示。 第一个弹出的元素是1,第二个是1,第三个是0,第四个是0。 因此,12的二表示为1100。 通过以上步骤,我们可以将任意的十转化为二数。这个过程中顺序的作用是将余数按照反序存储,然后逐个弹出,最终得到正确的二表示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

deadline是第一生产力,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值