【数制转换——栈】


1、描述:将非负的十进制数转换成对应的进制

2、算法基本思想(栈的思想)


1、构造一个空栈
2、当十进制数N非负时循环执行:


·N与要要转换的进制数m所得的余数压入栈中
·N更新为N与要转换进制数m的商


3、当栈非空时,循环执行


·弹出栈顶元素
·输出栈顶元素



3、算法描述(C语言伪码)

/*数值转换操作*/
void Conversion(int N, int m)
{
InitStack(S);//初始化栈
while (N)
{
Push(S,N % m);//将m进制数压入栈中
N = N / m;//更新N
}
while (S != NULL)
{
Pop(S,e);//出栈
printf("%d ", e);
}
}

4、例题:将十进制数159转换成八进制数

5、程序源码

#include<stdio.h>
#define OK 1
#define ERROR 0

typedef int SElemType;
typedef int Status;

typedef struct StackNode
{
SElemType data;//数据域
struct StackNode* next;//指针域
}StackNode,*LinkStack;

/*空栈的初始化*/
Status InitStack(LinkStack& S)
{
S = NULL;
return OK;
}

/*入栈操作*/
Status Push(LinkStack& S, int e)
{
LinkStack p;
p = new StackNode;//开辟一个新结点
p->data = e;
p->next = S;
S = p;//更改栈顶指针
return OK;
}

/*出栈操作*/
Status Pop(LinkStack& S, SElemType& e)
{
LinkStack p;
if (S == NULL) return ERROR;//空栈
e = S->data;//将栈顶元素赋值给e
p = S;//p临时存储S的空间
S = S->next;//修改栈顶指针位置
delete p;//释放空间
return OK;
}

/*数值转换操作*/
void Conversion(int N, int m)
{
LinkStack S;
int e;
printf("十进制数%d转换成%d进制数为:", N, m);
InitStack(S);//初始化栈
while (N)
{
Push(S,N % m);//将m进制数压入栈中
N = N / m;//更新N
}
while (S != NULL)
{
Pop(S,e);//出栈
printf("%d ", e);
}
}

int main(void)
{
int N,m;
printf("请输入要转换的十进制数:");
scanf_s("%d", &N);
printf("请输入要转换成的进制数:");
scanf_s("%d", &m);
Conversion(N,m);//数制的转换

printf("\n");
return 0;
}

6、调试结果

【数制转换——栈】_出栈