栈操作及应用:将一个非负十进制整数转换成d进制,并输出
算法思想:十进制数N转换成其他d进制数的转换公式 N=(N DIV d)*d+N MOD d,其中:DIV为整除运算,MOD为求余运算(取模),d为进制数。
//栈操作及应用:将一个非负十进制整数转换成d进制,并输出
// 算法思想:十进制数N转换成其他d进制数的转换公式 N=(N DIV d)*d+N MOD d,
//其中:DIV为整除运算,MOD为求余运算(取模),d为进制数。
#include <stdio.h>
#define MaxStackSize 32 //最大的存储个数
typedef int DataType; //存储的数据类型为int型----给int取别名为DataType
typedef struct
{
DataType stack[MaxStackSize]; //存储数据的顺序数组
int top; //栈顶
} SeqStack;
//初始化StackInitiate(SeqStack *S)
void StackInitiate(SeqStack *S)
{
S->top = 0; //栈顶置空
}
//非空否StackNotEmpty(SeqStack S)
int StackNotEmpty(SeqStack S)
{
if (S.top <= 0)
return 1; //如果栈顶 <= 0,说明栈为空 返回1
else
return 0; //不为空则 返回0
}
//入栈StackPush(SeqStack *S , DataType x)
int StackPush(SeqStack *S, DataType x) // x为入栈的数据元素
{
if (S->top >= MaxStackSize)
{
printf("堆栈已满无法入栈!\n");
return 0;
}
else
{
S->stack[S->top] = x; //栈顶放新入栈的数据元素x
S->top++; //栈顶++
return 1;
}
}
//出栈StackPop(SeqStack *S , DataType *d)
int StackPop(SeqStack *S, DataType *d)
{
if (S->top <= 0)
{
printf("堆栈已空无元素出栈!\n");
return 0;
}
else
{
S->top--; //栈顶--
*d = S->stack[S->top]; //将栈顶元素存放于d中
return 1;
}
}
//取栈顶元素
int StackTop(SeqStack *S, DataType *d)
{
if (S->top <= 0)
{
printf("堆栈已空无元素出栈!\n"); //将栈顶元素存放于d中
return 0;
}
else
{
*d = S->stack[S->top - 1];
return 1;
}
}
//将非负整数转换为d进制
SeqStack ChangeScale(int x, int d)
{
//创建堆栈对象myStack
SeqStack myStack;
//初始化堆栈
StackInitiate(&myStack);
// N=(N DIV d)*d+N MOD d,
int n = 0; //存放余数
//当除数为0时 退出循环
while (x > 0)
{
n = x % d; //先取模
x = x / d; //再除d
StackPush(&myStack, n); //将n进栈
}
return myStack;
}
int main()
{
//创建堆栈对象myStack
SeqStack myStack;
int x; //转换的非负十进制数
int d; //转换的进制
printf("输入要转换的非负十进制数:");
scanf("%d", &x);
printf("输入要转换的进制:");
scanf("%d", &d);
//调用转换进制的函数
myStack = ChangeScale(x, d);
//输出堆栈的元素---元素出栈
printf("十进制数:%d 转换为%d进制为:", x, d);
while (!StackNotEmpty(myStack))
{ //如果堆栈不为空
int temp; //存放出栈元素
StackPop(&myStack, &temp); //出栈
//输出出栈的元素
printf("%d ", temp);
}
return 0;
}