学了堆栈,我们都会了解,它的一个显著的特点:先进后出,就像把东西放在桶子里面,先放的在下面,要拿就要从上面开始拿出来。了解这个原理,就好了。
来一个实用的吧,就是进制的转换。二,八,十,十六进制的相互转换。(本程序对十六进制,含有字母的没做处理,但由其他进制的可以转成十六进制)就是有一点点瑕疵。
不过,这个问题不大,把输入的字母转化为数字就行了。其他的都可实现啦。
#include<stdio.h>
#include<math.h>
struct stack{ //定义堆栈
int num[1000];
int top;
}stk;
void push(struct stack &stk,int p) //入栈函数,引用
{
if(stk.top>1000) return;
stk.num[stk.top++]=p;
}
int pop(struct stack &stk)
{
return (stk.num[stk.top--]);
}
int digit(int a)
{
int i=0;
while(a)
{
a/=10;
i++;
}
return i;
}
void resolve(int c,int a,int d)
{ int i,t,p,b,k=0;
i=digit(a);
while(a){
int s=a%10;
a/=10;
push(stk,s);
}
stk.top--;
while(i&&stk.top!=-1){
p=pop(stk);
b=pow(c,i-1);
k+=p*b;
i--;
}
stk.top=0;
while(k){
t=k%d;
k/=d;
push(stk,t);
}
}
void putout(struct stack &stk)
{
int q;
stk.top--;
while(stk.top!=-1){
q=pop(stk);
switch(q)
{
case 10:printf("A");break;
case 11:printf("B");break;
case 12:printf("C");break;
case 13:printf("D");break;
case 14:printf("E");break;
case 15:printf("F");break;
case 16:printf("H");break;
default :printf("%d",q);break;
}
}
}
void main()
{
int c, n,d;
while(1)
{
printf("请输入该数的进制,及该数,以及要转换的进制:");
scanf("%d%d%d",&c,&n,&d);
stk.top=0;
resolve(c,n,d);
printf("转化为%d进制后为:",d);
putout(stk);
printf("\n");
}
}