题目
将十进制数转换成其他进制的数。
分析
首先要知道常规是怎么求的。
核心代码如下:
/* 进制转换 */
/* N指的是要进行转换的10进制数;S指的是进制 */
void conversion(int N,int S) {
/* 初始化栈 */
SqStack stack;
initStack(stack);// 初始化顺序栈
int x;// 用来存储出栈的元素值
/* 入栈 */
while(N!=0) { // 循环
push(stack,N%S);// 将余数压入栈中
N=N/S;// 继续求商
}
/* 出栈 */
while(stack.top!=-1) { // 当栈不为空时不断循环
pop(stack,x);// 将栈的一个个数出栈形成需要的结果
printf("%d",x);// 打印出栈元素
}
}
全部代码:
#include <stdio.h>
#define maxSize 20
typedef struct {
int data[maxSize];// 存放栈中元素,maxSize是已经定义好的常量
int top;// 栈顶指针
} SqStack; // 顺序栈类型定义
/* 初始化顺序栈 */
/* &st指的是要操作的顺序栈 */
void initStack(SqStack &st) {
st.top=-1; // 只需将栈顶指针设置为-1,本栈中将top=-1规定为栈空状态
}
/* 判断栈空 */
/* st指的是要进行判空的顺序栈 */
int isEmpty(SqStack st) {
// 栈为空的时候返回1,否则返回0
if(st.top==-1) { // 判空的条件是栈顶指针是否等于-1
return 1;
} else {
return 0;
}
}
/* 判断栈满 */
/* st指的是要进行判满的顺序栈 */
int isFull(SqStack st) {
// 如果栈顶指针等于maxSize-1那么栈满,否则栈空
if(st.top==maxSize-1) { // maxSize是栈中最大元素个数,已经定义
return 1;// 栈满返回1
} else {
return 0;// 栈空返回0
}
}
/* 进栈 */
/* &st指的是要操作的栈;x指的是要进栈的数据 */
int push(SqStack &st,int x) {
/* 进栈首先要判断栈是否栈满,如果满栈则不能进栈 */
if(isFull(st)==1) {
return 0;// 如果栈满返回0,表示不能进栈
} else {
// 注意:++top和top++在这里的作用是一样的,都可以使用,如果是a=++top和a=top++,那么两个a的值是不一样的,最后top的值还是一样
++st.top;// 先移动指针,再进栈
st.data[st.top]=x;
return 1;// 进栈成功返回1
}
}
/* 出栈 */
/* &st指的是要操作的栈;&x指的是要出栈的数据 */
int pop(SqStack &st,int &x) {
/* 出栈之前要判断栈是否为空 */
if(isEmpty(st)==1) {// 1表示栈空,0表示非空
return 0;// 如果栈空,不能出栈,返回0
} else {
x=st.data[st.top];// 先取出元素,再出栈
--st.top;
return 1;// 出栈成功返回1
}
}
/* 打印栈,从左到右表示栈底到栈顶 */
/* stack表示要被打印的栈 */
void printStack(SqStack stack) {
printf("\n");
for(int i=0; i<=stack.top; i++) {// 注意:data[0]表示栈底元素,data[top]表示栈顶元素
printf("%d\t",stack.data[i]);// 打印栈中元素
}
printf("\n");
}
/* 进制转换 */
/* N指的是要进行转换的10进制数;S指的是进制 */
void conversion(int N,int S) {
/* 初始化栈 */
SqStack stack;
initStack(stack);// 初始化顺序栈
int x;// 用来存储出栈的元素值
/* 入栈 */
while(N!=0) { // 循环
push(stack,N%S);// 将余数压入栈中
N=N/S;// 继续求商
}
/* 出栈 */
while(stack.top!=-1) { // 当栈不为空时不断循环
pop(stack,x);// 将栈的一个个数出栈形成需要的结果
printf("%d",x);// 打印出栈元素
}
}
int main() {
int N;
printf("请输入十进制数:");
scanf("%d",&N);
printf("十进制转八进制:");
conversion(N,8);
printf("\n");
printf("十进制转十六进制:");
conversion(N,16);
printf("\n");
printf("十进制转二进制:");
conversion(N,2);
printf("\n");
return 0;
}
运行结果如下:
简化代码如下:
/* 进制转换 */
/* N指的是要进行转换的10进制数;S指的是进制 */
void conversion(int N,int S) {
/* 初始化栈 */
int stack[maxSize];
int top=-1;
int x;// 用来存储出栈的元素值
/* 入栈 */
while(N!=0) { // 循环
stack[++top]=N%S;// 将余数压入栈中
N=N/S;// 继续求商
}
/* 出栈 */
while(top!=-1) { // 当栈不为空时不断循环
x=stack[top--];// 将栈的一个个数出栈形成需要的结果
printf("%d",x);// 打印出栈元素
}
}