C++数据结构之栈的应用1:进制转换

博客主要介绍栈在进制转换中的应用。利用栈后进先出的特点,可实现进制数取余后的结果输出。同时也提到了使用递归方法进行进制转换,递归虽简化代码,但对于初学者理解有一定难度,结合打印顺序较易理解。代码仅支持十进制相互转化。

栈的应用1:进制转换

1.进制转化简图

进制转化简图
也就是每次进制数取余,最后一次将余数全部返回输出,我们不禁想到栈的特点,后进先出,满足这种特点,同样的我们也可以利用递归的方法,最后全部输入。

2.进制转化

说明:本代码仅支持十进制相互转化

函数列表:

#pragma once
#include <iostream>
#include <stdlib.h>
#define INIT_STACK_SIZE 50	//初始栈空间
#define STACKINCREMENT 10	//增加步长
typedef struct
{
	int *base;		//栈底指针
	int *top;		//栈顶指针
	int stackSize;	//栈长
}sqStack;
//初始化栈
void InitStack(sqStack *s);		
//压栈
void Push(sqStack *s,int e);
//出栈
void Pop(sqStack *s,int &e);
//销毁栈
void DestoryStack(sqStack *s);
//打印
void print(sqStack s);
//获取栈长
int StackLen(sqStack s);
//进制转化
void decoct(sqStack *s,int ph1,int ph2);

函数实现

#include "SqStack.h"
void InitStack(sqStack *s)
{
	s->base = (int *)malloc( INIT_STACK_SIZE * sizeof(int));
	if ( !s->base )
	{
		exit(0); 
	}
	s -> top = s -> base;
	s->stackSize = INIT_STACK_SIZE;
}
void Push(sqStack *s,int e)
{
	if ( s -> top - s -> base >= s -> stackSize)
	{
		s->base = (int *)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(int));
		if (!s -> base)
		{ 
			exit(0);
		}
		s->top = s->base + s->stackSize;
		s->stackSize += STACKINCREMENT;
	}
	*s -> top = e;
	s -> top++;
}
void Pop(sqStack *s,int &e)
{
	if (s -> base == s->top)
		std::cout <<"栈满了"<<std::endl;
	else
	{
		e = *--(s->top);
	}
}
void DestoryStack(sqStack *s)
{
	s ->base = s->top = NULL;
	s -> stackSize = 0;
}
int StackLen(sqStack s)
{
	return(s.top - s.base);
}
void print(sqStack s)	//逆向打印
{
	int num=0 ;
	int len = StackLen(s);
	for (int i = 0 ; i < len;i++)
	{
		Pop(&s,num);
		std::cout << num;
	}
}
void decoct(sqStack *s,int ph1,int ph2)	
//对栈进行操作,必须以指针的方式,这里循环取余,并且压入栈中
{
	int yu = 0;
	while ( ph1 )
	{
		yu = ph1%ph2;
		Push(s,yu);
		ph1 /= ph2;
	}
}

主函数

#include "SqStack.h"
int main()
{
	sqStack s;
	InitStack(&s);
	std::cout <<"输入要转换的数(10进制)和进制(10进制):"<<std::endl;
	int a,b;
	std::cin >> a >> b;
	decoct(&s,a,b);
	int len =StackLen(s);
	std::cout <<"栈的当前容量是:"<< len <<std::endl;
	print(s);
	DestoryStack(&s);
}

3.使用递归方法

递归简化代码,像本人这种初学者来说还是花了一会来理解,但是只要掌握了递归的思想,结合本题中打印是从后向前,就容易理解一点。

#include <iostream>
int gn(int x,int y)
{
	if (x==0)
		return 0;
	else
	{
		gn(x/y,y);
		std::cout << x%y<<std::endl;
	}
}

int main()
{
	int x,y;
	std::cout <<"输入操作数和进制"<<endl;
	std::cin>>x>>y;
	gn(x,y);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值