数据结构栈的应用:数制转换

内容:数据结构第三章:栈的应用

参考书:数据结构严书,高一凡数据结构与算法

测试软件:Visual Studio 2017

原理解释:将十进制转换成其它进制

整数情况:(基数除法)

把要转换的十进制数除以新的进制的基数,把余数作为新进制的最低位;

把上一次得的商在除以新的进制基数,把余数作为新进制的次低位;

继续上一步,直到最后的商为零,这时的余数就是新进制的最高位。

整个过程正好与栈的入栈、出栈顺序相同。
如:
在这里插入图片描述
c1.h:

#ifndef __C1_H
//#define __C1_H
//c1.h(头文件名)
#include <string.h>     //字符串函数头文件
#include <ctype.h>      //字符函数头文件
#include <malloc.h>     //malloc()等
#include <limits.h>     //INT_MAX等
#include <stdio.h>      //标准输入输出头文件,包括EOF( = ^Z 或F6),NULL等
#include <stdlib.h>     //atoi(), exit()
#include <io.h>         //eof()
#include <math.h>       //数学函数头文件,包括floor(), ceil(), abs()等
#include <sys/timeb.h>  //ftime()
#include <stdarg.h>   //提供宏va_start, va_arg, va_end,用于存取变长参数表
//函数结果状态代码。在严书第十页
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
//#define INFESIBLE -1
//#define OVERFLOW -2   因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedef int Status; //Status是函数的;类型其值是函数结果状态代码,如OK等
typedef int Boolean; //Boolean是布尔类型,其值是TRUE或FALSE,第7、8、9章用到
typedef int SElemType;
typedef SElemType ElemType;
#define STACK_INIT_SIZE 10
#define STACK_INCREMENT 2
struct SqStack
{
	SElemType * base;
	SElemType * top;
	int stacksize;
};
#endif // !__C1_H
#pragma once

main.cpp:

# define N 8    //将要转换的进制数
#include "c1.h"

void InitStack(SqStack &s)  //栈的初始化
{
	s.base = (SElemType *)malloc(sizeof(SElemType) * STACK_INIT_SIZE);
	if (!s.base)
		exit(OVERFLOW);
	s.top = s.base;
	s.stacksize = STACK_INIT_SIZE;  //初始空间 10
}
Status StackEmpty(SqStack s)   //判断是否为空
{
	if (s.base == s.top)
		return TRUE;
	else
		return FALSE;
}
void Push(SqStack &s, SElemType e)  //入栈
{
	if ((s.top - s.base) == s.stacksize)
	{
		s.base = (SElemType *)realloc(s.base, sizeof(SElemType) * (s.stacksize + STACK_INCREMENT));
		if (!s.base)
			exit(OVERFLOW);
		s.top = s.base + STACK_INCREMENT;
		s.stacksize = s.stacksize + STACK_INCREMENT;
	}
	*(s.top)++ = e;   //e入栈
}
Status Pop(SqStack &s, SElemType &e)  //出栈
{
	if (s.top == s.base)
		return ERROR;
	e = *--s.top;  //s.top指向栈顶元素的下一个位置
	return OK;
}
void test_1(void)
{	//对于输入的任意一个非负十进制整数,打印输出与其等值的N进制数
	SqStack s;
	unsigned n;
	SElemType e;
	InitStack(s);
	printf("将十进制整数n转换为%d进制数,请输入正整数n:", N);
	scanf("%u", &n);
	while (n)
	{
		Push(s, n%N);
		n = n / N;
	}
	while (!StackEmpty(s))
	{
		Pop(s, e);
		printf("%d", e);
	}
	printf("\n");
}
int main(void)
{
	test_1();
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值