东软数据结构实验报告通过栈和队列来实现进制转换.docx
《东软数据结构实验报告通过栈和队列来实现进制转换.docx》由会员分享,可在线阅读,更多相关《东软数据结构实验报告通过栈和队列来实现进制转换.docx(17页珍藏版)》请在冰豆网上搜索。
![东软数据结构实验报告通过栈和队列来实现进制转换.docx](https://file1.bdocx.com/fileroot1/2023-7/14/9067f2f5-ee03-42d2-9ee4-8d56864abdf6/9067f2f5-ee03-42d2-9ee4-8d56864abdf61.gif)
东软数据结构实验报告通过栈和队列来实现进制转换
实验报告
(一)
姓名:
1111111111111学号:
XX
实验
名称
栈和队列的操作
指导教师
xxx
实验
地点
xxx
实验日期
xxx
实验
目的
理解栈和队列的概念,完成栈和队列的各种基本操作
同组
成员
无
实验过程
1、项目简介
进制转换
通过编写函数实现十进制浮点数到R进制的转换,在十进制浮点数的整数部分利用栈结构实现,小数部分用队列结构实现。
2、项目实施:
1.读取数据并获得小数点位置
2.将字符串转为整数形式
.
3.对整数部分进行入栈
4.获得小数部分并入队
5.整数和小数的联合输出
6.源代码:
#include
#include
#include
#definesize10//小数部分大小
#definemaxsize20//整数部分大小
//*********************************
//*********************************
//小数部分——队列
typedefstruct
{
chardata[10];//读取转制后的小数部分
intfront,rear;//队首尾指针
}Queue;//循环队列
//*********************************
//初始化队列
voidinit_Queue(Queue*q)
{
q->front=q->rear=0;
}
//*********************************
//入队
intpush_Queue(Queue*q,intx)
{
if((q->rear+1)%size==q->front)//判断队满
{
printf("队列满!
不允许入队\n");
return0;
}
else
{
q->rear=(q->rear+1)%size;
q->data[q->rear]=x;
return1;
}
}
//*********************************
//出队
intpop_Queue(Queue*q,int*x)
{
if(q->rear==q->front)
{
printf("队空!
");
return0;
}
else
{
q->front=(q->front+1)%size;
*x=q->data[q->front];//读取队头元素
return1;
}
}
//*********************************
//*********************************
//整数部分——栈
typedefstruct
{
chardataint[100];
inttop;
}Stack;
//*********************************
//-制空栈
voidinit_Stack(Stack*s)
{
s->top=0;
}
//*********************************
//进栈
intpush_Stack(Stack*s,intx)
{
if(s->top==maxsize)
{
printf("栈已满!
");
return0;
}
else
{
s->dataint[s->top]=x;//数据进栈
s->top++;
return1;
}
}
//*********************************
//出栈
intpop_Stack(Stack*s,int*x)
{
if(s->top==0)
{
printf("栈空,无数据可取!
");
return0;
}
else
{
s->top--;
*x=s->dataint[s->top];//取处数据
return1;
}
}
//*********************************主程序
intmain()
{
//*********************************
//读入数据
chara[20];
intaim;
printf("请输入一个十进制浮点数:
");//以字符串形式输入一个浮点数
gets(a);
printf("请输入目标进制:
");
scanf("%d",&aim);
if(aim==1){
printf("ERROR!
PLEASEINPUTANUMBERANDITISBIGGERTHAN1");
return0;
}
//*********************************
//读取小数点位置
inti;
intpos;//小数点位置
for(i=0;i{
if(a[i]=='.')
{
pos=i;
break;
}
}
//*********************************
//定义栈对整数部分转化后并入栈
Stackss;
init_Stack(&ss);//初始化栈
//*********************************
//将整数部分转换为int型
intbegin=1;
intbnum;
if(a[0]=='-'){
intbnum=a[1]-'0';//判断是否为负数
begin=2;
}
elsebnum=a[0]-'0';
for(i=begin;i{
bnum=bnum*10+a[i]-'0';
}
//printf("整数部分:
%d\n",bnum);
//*********************************
//依次求得所转进制的每一位并入栈
while(bnum)
{
//if(bnum/aim!
=0)
push_Stack(&ss,bnum%aim);
bnum=bnum/aim;
}
//*********************************
//出栈读取整数部分结果
intflag,z;
flag=pop_Stack(&ss,&z);
if(flag==1)
{
printf("目的进制数为:
");
for(i=ss.top;i>=0;i--)//先从顶端出栈
printf("%d",ss.dataint[i]);
}
elseprintf("无数据!
");
//printf("\n");
//*********************************
//定义队列并将小数部分转化后入队
Queueq,*cq=&q;
init_Queue(cq);
//*********************************
//将小数点后面的部分转为浮点数
intc=1;
intanum=a[pos+1]-'0';
for(i=pos+2;i{
anum=anum*10+(a[i]-'0');
c++;
}
doublesmall=((double)anum)/pow(10,c);
//printf("小数部分:
%lf\n",small);
//*********************************
//依次求得小数部分的每一位并入队
intzz;
intinnum;
for(i=0;i<6;i++)
{
innum=(((int)(small*aim)))%10;//取出小数点前的部分
small=small*aim-innum;//得到减去小数点前段的部分继续与aim相乘
push_Queue(cq,innum);
}
//*********************************
//出队列
printf(".");
if(pop_Queue(cq,&zz)){
for(i=(cq->front)%size;i!
=(cq->rear+1)%size;i=(i+1)%size)
printf("%d",cq->data[i]);
}
//*********************************
return0;
}
实验总结
通过对数据的单个读取并入栈,后续的出栈顺序为从上到下,先进后出,读取数据后为相反的顺序,而队列的顺序出队为先进先出,对小数的存储可直接进行读取。