实验内容
利用栈的功能将十进制整数转换成二至九之间的任一进制数输出。
基本原理
将十进制整数N转换为r进制数的过程中,由低到高依次得到r进制数中的每一位数字,而输出时又需要由高到低依次输出每一位,恰好与计算过程相反,输出的过程符合“后进先出”的栈的特性。因此,可在转换过程中每得到一位r进制数就进栈保存,转换完毕后依次出栈正好是转换结果。算法思路如下:
-
- 若N≠0,则将N%r压入栈s中。
- 用N/r代替N。
- 若N>0,则重复步骤①、②;若N=0,则将栈a的内容依次出栈。
- 实验步骤和结果
- 步骤
- 若N≠0,则将N%r压入栈s中。
- 用N/r代替N。
- 若N>0,则重复步骤①、②;若N=0,则将栈a的内容依次出栈。
- 结果
- 实验中出现的问题及解决方法
- 问题:return FALSE错误
解决方法:改为
- 实验总结及体会
由于进制转换符合先进后出的特点,所以用栈来实现这一程序设计显得尤为合适。当然,所有符合“先进后出”特点的流程都可以用栈来实现。由于第一次接触栈这个新的概念,需要多加练习巩固这个知识点的代码流程。
- 附录
#include<stdio.h>
#include<malloc.h>
#define maxsize 100
typedef int datatype;
typedef struct
{
int stack[maxsize];
int top;
}seqstack;
seqstack *initstack()
{
seqstack *s;
s=(seqstack *)malloc(sizeof(seqstack));
if(!s)
{
printf("空间不足");
return NULL;
}
else
{s->top=0;
return s;
}
}
seqstack *push(seqstack *s,int x)
{
if(s->top==maxsize)
{
printf("the stack is overflow!\n");
return NULL;
}
else{
s->stack[s->top]=x;
s->top++;
return s;
}
}
int stackempty(seqstack *s)
{
if(s->top==0)
return 1;
else
return 0;
}
int pop(seqstack *s)
{
int y;
if(s->top==0)
{
printf("the stack is empty!\n");
return 0;
}
else
{
s->top--;
y=s->stack[s->top];
return y;
}
}
void conversion(int N,int r)
{
int x=N,y=r;
seqstack *s;
s=initstack();
while(N!=0){
push(s,N%r);
N=N/r;
}
printf("\n十进制数%d所对应的%d进制数是:",x,y);
while(!stackempty(s))
printf("%d",pop(s));
printf("\n");
}
int main()
{
int n,r;
printf("请输入任意一个十进制整数及其所需转换的二至九间的任一进制数:\n");
scanf("%d %d",&n,&r);
conversion(n,r);
}