内容:数据结构第三章:栈的应用
参考书:数据结构严书,高一凡数据结构与算法
测试软件: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;
}