二、利用栈实现数值转换,先定义一个栈的顺序存储结构,那么我们需要定义一个结构体,结构体里面有个int类型的数组,还有一个top用来存储栈顶元素的下标。栈是一种基本的数据结构,它遵循先进后出的原则。这意味着最后添加到栈中的元素将会首先被取出。栈通常具有两个主要操作:压栈:将元素添加到栈的顶部。出栈:从栈的顶部移除元素。输入转化之前的数,并且通过进制转化,计算出他的sum,再通过sum来转化成对应的进制,程序运行结果如图2-1。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>
#define Maxsize 100
// 定义顺序栈的结构体
typedef struct SqStack
{
int data[Maxsize];// 存储栈中元素的数组
int top;// 栈顶指针
}SqStack;
// 初始化栈
void Init_Sqstack(SqStack *S)
{
S->top = -1;// 栈初始化为空,栈顶指针设为-1
}
// 进栈操作
bool push_SqStack(SqStack *S,int x)
{
if(S->top == Maxsize - 1)
return false;// 栈满,返回false
else
S->data[++S->top] = x;// 元素x进栈,栈顶指针加
return true;
}
// 出栈操作
bool pop_SqStack(SqStack *S,int *x)
{
if(S->top == -1)
return false;// 栈空,返回false
else
{
*x = S->data[S->top];// 将栈顶元素赋值给x
S->top--;// 栈顶指针减1
}
return true;
}
// 展示栈中元素
void show_SqStack(SqStack S)
{
for(int i = S.top; i >= 0; i--)
{
printf("%d ",S.data[i]);// 从栈顶开始打印栈中元素
}
}
// 将字符数组转换为对应进制的整数
int char_to_num(char *a,int x)
{
int lenth = strlen(a);// 字符串长度
int num[100];// 存储转换后的每一位数字
int sum = 0;// 转换后的整数值
for(int i = 0; i < lenth; i++)
{
if(a[i] >= '0' && a[i] <= '9')// 如果是数字字符,转换为数字
num[i] = (a[i]-'0');
else
num[i] = (a[i]-'A'+10);// 如果是字母字符,转换为对应的数字(A-F为10-15)
}
for (int i = 0; i < lenth; i++)
{
sum += num[i] * pow(x, lenth - i - 1); // 按权展开求和
}
return sum;
}
int main()
{
SqStack S;
Init_Sqstack(&S);// 初始化栈
printf("请输入想要转化前数的进制:");// 提示用户输入原数的进制
int i;
scanf("%d",&i);// 读取用户输入的进制
printf("\n请输入想转化后的进制:");// 提示用户输入目标进制
int j;
scanf("%d",&j);// 读取用户输入的目标进制
printf("\n请输入想要转化的数:");// 提示用户输入需要转换的数
char s[100];
scanf("%s", s);// 读取用户输入的数
int m;
m = char_to_num(s,i);// 将字符数组转换为对应进制的整数
// 将整数转换为目标进制的数,并依次入栈
while(m)
{
push_SqStack(&S,m % j);// 取余数并入栈
m = m / j;// 整除目标进制数
}
show_SqStack(S);// 展示栈中元素,即转换后的目标进制数
return 0;
}