利用顺序栈将输入的非负的十进制数N转换为指定的d(二、八或十六)进制数。 顺序栈的定义如下: #define STACKSIZE 100 typedef int DataType; typedef struct { DataType items[STACKSIZE]; /*存放栈中元素的一维数组*/ int top; /*用来存放栈顶元素的下标*/ }SqStack; 函数接口定义: int DecimalConvert(S
时间: 2024-03-12 13:43:42 浏览: 118
以下是一个实现将十进制数转换为指定进制数的代码,基于顺序栈实现:
```
#include <stdio.h>
#include <stdlib.h>
#define STACKSIZE 100
typedef int DataType;
typedef struct {
DataType items[STACKSIZE];
int top;
} SqStack;
SqStack* InitStack() {
SqStack* S = (SqStack*)malloc(sizeof(SqStack));
S->top = -1;
return S;
}
int StackEmpty(SqStack* S) {
return S->top == -1;
}
int StackFull(SqStack* S) {
return S->top == STACKSIZE - 1;
}
void Push(SqStack* S, DataType x) {
if (StackFull(S)) {
printf("Stack overflow\n");
exit(1);
}
S->items[++S->top] = x;
}
DataType Pop(SqStack* S) {
if (StackEmpty(S)) {
printf("Stack underflow\n");
exit(1);
}
return S->items[S->top--];
}
int DecimalConvert(int N, int d) {
SqStack* S = InitStack();
int r, q = N, result = 0;
while (q) {
r = q % d;
Push(S, r);
q /= d;
}
while (!StackEmpty(S)) {
r = Pop(S);
result = result * 10 + r;
}
return result;
}
int main() {
int N, d;
printf("Enter a decimal number: ");
scanf("%d", &N);
printf("Enter the base (2, 8, or 16): ");
scanf("%d", &d);
printf("%d in base %d is %d\n", N, d, DecimalConvert(N, d));
return 0;
}
```
函数`DecimalConvert`接收两个参数,一个是需要转换的十进制数N,另一个是需要转换为的进制d。该函数使用栈来实现进制转换。首先将十进制数N不断除以进制d,将余数压入栈中,直到商为0为止。然后从栈中弹出余数,依次组成转换后的数。最后返回转换后的数。
需要注意的是,该函数返回的是int类型的结果。对于二进制和八进制,结果在打印时需要使用对应的进制标识符(0b或0),例如:
```
printf("%d in base %d is 0b%d\n", N, d, DecimalConvert(N, d)); // 二进制
printf("%d in base %d is 0%o\n", N, d, DecimalConvert(N, d)); // 八进制
printf("%d in base %d is 0x%x\n", N, d, DecimalConvert(N, d)); // 十六进制
```
其中%d表示输出十进制数,%o表示输出八进制数,%x表示输出十六进制数。
阅读全文