数据结构实验报告栈进制转换
- 格式:pdf
- 大小:152.56 KB
- 文档页数:6
数制转换实验目的:使用堆栈的存储结构实现数制转换,如10进制->2进制等实验思路:1、写出堆栈的相关操作函数,如:创建【int InitStack( SqStack *S )】、压入【int Push(SqStack *S,int e)】、弹出【int Pop(SqStack *S,int *e)】、销毁【void DestroyStack(SqStack *S)】、判断是否为空【int StackEmpty(SqStack *S)】等。
2、堆栈的各操作函数完成后编写功能函数——数制转换【voidchangeNumber(int *num,int to)】。
3、数制转换函数之后编写主函数,使用上述函数实现数制转换的功能核心代码:1、数制转换函数:void changeNumber(int *num,int to){int result[100],yu,e,m,i=0,j=0; //result[]是转换后的结果,yu是取余的结果SqStack S;for(m=0;m<100;m++){result[m]='#';}InitStack(&S);while(*num!=0){yu=*num%to;Push(&S,yu);*num=*num/to;}while(!StackEmpty(&S)){Pop(&S,&e);result[i]=e;i++;}while(1){printf("%d",result[j]);j++;if(result[j]=='#'){printf("\n");break;}}DestroyStack(&S);}2、主函数:int main(){int *p,num,to;int ok;while(1){printf("您想转换的数字是:");scanf("%d",&num);printf("转换成多少进制:");scanf("%d",&to);p=#changeNumber(p,to);while(1){printf("继续请按1,退出请按0...");scanf("%d",&ok);if(ok!=0 && ok!=1){printf("抱歉,您的输入有误,");}else if(ok==0 || ok==1){break;}}if(ok==0){break;}}system("pause");return 1;}功能演示:1、运行执行文件,进入dos窗口后可见提示:“您想转换的数字是:”2、输入:“1000”,回车后可见提示:“转换成多少进制:”3、输入:“6”,回车,得到结果:“4344”,又见提示:“继续请按1,退出请按0...”4、输入0退出。
计算机科学与技术系实验报告专业名称计算机科学与技术课程名称《数据结构》项目名称栈实现进制的转换班级学号姓名同组人员无实验日期一、实验目的与要求:(简述本次实验要求达到的目的,涉及到的相关知识点,实验的具体要求。
)(一)实验目的:应用栈来实现对数据的操作。
掌握,进栈,出栈(二)实验要求:用栈实现对数据进制的转换(三)实验环境:VC++6.0.二、实验内容#include <stdio.h>#include <malloc.h>#define maxlen 100typedef int dataType;typedef struct{dataType data[maxlen];int top;}seqstack;/*置空栈*/seqstack *Initstack(seqstack *S){S->top = -1;return S;}/*初始化栈*/seqstack *setstack(){seqstack *S;S = (seqstack *) malloc (sizeof(seqstack));S->top = -1;return S;}/*判断栈空*/int stackEmpty(seqstack *S){if(S->top<0)return 1;elsereturn 0;}/*判断栈满*/int stackFull(seqstack *S){if(S->top < (maxlen -1) && S->top >= -1) return 0;elsereturn 1;}/*入栈*/void push(seqstack *S, dataType x){if(stackFull(S))printf("此栈已经满\n");else{S->top ++;S->data[S->top] = x;}}/*出栈*/dataType pop(seqstack *S){dataType x;if(stackEmpty(S))printf("此栈为空\n");else{x = S->data[S->top];S->top--;}return x;}void main(){seqstack *S;dataType e;int m,n;S = setstack();printf("请输入一个十进制的数:");scanf("%d", &e);printf("请输入你想转出成的进制:");scanf("%d", &m);while(e){n = e%m;push(S,n);e = e/m;}printf("转换成%d进制为:", m);while(!stackEmpty(S)){e = pop(S);printf("%d",e);}printf("\n");}三、实验分析与小结(实验过程中的问题分析、产生的原因以及解决方法;实验结果分析;有待优化思路)(一)实验结果截图(二)总结通过栈,先进后出的特点,我们可以对数据实现进制的转换。
数据结构实验报告栈进制转换数据结构实验报告栈进制转换一、实验目的栈是一种常见的数据结构,本实验的目的在于通过实现栈的基本操作,设计并实现一个进制转换的程序,并通过实验验证程序的正确性和效率。
二、实验原理1.栈的定义和基本操作栈是一种后进先出(Last In First Out,简称LIFO)的数据结构。
它可以通过一个指针来标识当前栈顶元素,栈顶指针top的起始值为-1,空栈时top=-1.2.栈的进制转换将一个十进制数转换为其他进制(如二进制、八进制、十六进制)的过程中,可以通过栈来实现。
具体步骤如下:- 初始化一个空栈;- 将十进制数依次除以目标进制的基数,将余数依次入栈,直到商为0;- 依次出栈,将出栈的余数组合起来,得到转换后的目标进制数。
三、实验内容1.实现栈的基本操作(1)定义栈结构,包括元素数组和栈顶指针;(2)实现入栈操作push(),将元素插入到栈顶;(3)实现出栈操作pop(),从栈顶删除一个元素并返回其值;(4)实现获取栈顶元素的操作getTop(),返回栈顶元素的值;(5)实现判断栈是否为空的操作isEmpty(),返回布尔值;(6)实现判断栈是否已满的操作isFull(),返回布尔值。
2.设计并实现进制转换的程序(1)初始化一个空栈用于存放转换后的数字;(2)输入十进制数num和目标进制target;(3)通过栈的操作将num转换为target进制数;(4)输出转换后的结果。
四、实验步骤1.实现栈的基本操作(1)定义栈的结构和相关操作;(2)编写相应的测试代码,验证栈的基本操作是否正确。
2.设计并实现进制转换的程序(1)根据原理部分的步骤,设计转换程序的具体逻辑;(2)编写相应的测试代码,验证转换程序的正确性和效率。
五、实验结果与分析1.给定一个十进制数num=12345,目标进制为二进制(target=2),经过进制转换后得到的结果为.111.2.给定一个十进制数num=456,目标进制为八进制(target=8),经过进制转换后得到的结果为.710.本实验的结果表明,转换程序能够正确地将十进制数转换为目标进制数,并且具有较高的效率。
实训2 利用栈实现任意进制的转换一、实验目的加深对于栈结构的理解,掌握利用栈结构的特点实现进制转换的算法。
二、实验内容利用栈实现进制转换。
三、实验所需设备及软件环境标配笔记本电脑Window2000/xp操作系统、turboc2.0或Turbo C_C++ for Windows 集成实验与学习环境四、实验步骤1.确定堆栈的存储结构:顺序存储或链接存储;2.打开代码编辑环境;3.编辑源程序;顺序存储:#include "stdio.h"#define MAX 100int s[MAX],tp=0;void initstack(){int i;for(i=0;i<MAX;i++)s[i]=0;}void push(x)int x;{if(tp>=MAX){printf("stack full\n");return;}s[tp]=x;tp++;}pop(){int x;tp--;if(tp<0){printf("stack underflow\n");return 0;}x=s[tp];return x;}void conversion(){int e=0,n=0; initstack(); scanf("%d",&n); while(n){push(n%8);n=n/8;}while(!empty()){e=pop();printf("%d",e); }}empty(){if (tp==0)return 1;else return 0;}main(){conversion();}链接存储:#include "stdio.h"struct stack{int d;struct stack *next;};isempty(t)struct stack *t;{return (t==NULL);}push(t,x)struct stack **t;int x;{struct stack *temp;temp=(struct stack *)malloc(sizeof(struct stack));temp->d=x;temp->next=*t;*t=temp;}pop(t)struct stack **t;{ int x;struct stack *t1=*t;x=t1->d;*t=t1->next;free(t1);return(x);}elseprintf("\nempty stack");}void initstack(struct stack **ps) { *ps=NULL;}void conversion(){struct stack *t;int e=0,n=0;scanf("%d",&n);initstack(&t);while(n){push(&t,n%8);n=n/8;}e=pop(&t);printf("%d",e);}}main(){conversion();}4.编译源程序,确认无误后运行,检验是否得到正确运行结果;5.保存程序。
SDUT2131数据结构实验之栈与队列⼀:进制转换数据结构实验之栈与队列⼀:进制转换Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description输⼊⼀个⼗进制⾮负整数,将其转换成对应的 R (2 <= R <= 9) 进制数,并输出。
Input第⼀⾏输⼊需要转换的⼗进制⾮负整数;第⼆⾏输⼊ R。
Output输出转换所得的 R 进制数。
Sample Input12798Sample Output2377提⽰:本题属于栈操作,可以借助栈来完成,⾸先要明⽩其他进制转化为⼗进制的原理,从⽽反向推出由⼗进制转化为其他进制的⽅法,具体操作代码中会注释。
代码实现如下(g++):#include <bits/stdc++.h>using namespace std;int main(){stack<int>t;//C++中建栈⽅便,可以直接⽤stack代替int n,r,b;std::ios::sync_with_stdio(false);//防⽌使⽤cin超时cin>>n;cin>>r;if(n==0)cout<<"0";//0的话进制转化均为0,要注意while(n>0){b=n/r;t.push(n%r);//将n对r取模⼊栈n=b;}while(!t.empty()){cout<<t.top();//将栈顶数据出栈t.pop();}return0;}/***************************************************Result: AcceptedTake time: 0msTake Memory: 208KB****************************************************/。
数据结构实验报告实验名称:栈和队列及其应用班级:12级电气本2学号:2012081227姓名:赵雪磊指导教师:梁海丽日期:2013年9月23日数学与信息技术学院一、实验目的1. 掌握栈和队列的概念。
2.掌握栈和队列的基本操作(插入、删除、取栈顶元素、出队、入队等)。
3.理解栈和队列的顺序、链式存储。
二、实验要求利用顺序栈将任意一个给定的十进制数转换成二进制、八进制、十六进制数并输出。
三、算法描述#include "stdafx.h"#include "iomanip.h"void D10to2_8_16(int i,char radix){char m;if(i>=radix)D10to2_8_16(i/radix,radix);if((m=i%radix+'0')>0x39)m+=7;cout << m;}void main(void){int nDec;cout << "请输入一个十进制正整数...\n" << "nDec=";cin >> nDec;cout << "转换为二进制是:";D10to2_8_16(nDec,2);cout << endl;cout << "转换为八进制是:0";D10to2_8_16(nDec,8); cout << endl;cout << "转换为十六进制是:0x";D10to2_8_16(nDec,16);cout << endl;}四、程序清单#include<iostream>#include<malloc.h>#define N 2 //可以控制进制转换using namespace std;typedef struct{int *top;int *base;int stacksize;}stack;int initstack(stack &s){s.base =(int *)malloc(100*sizeof(int)); s.top =s.base ;s.stacksize =100;return 1;}int push(stack &s,int e){*s.top =e;s.top ++;return 1;}int pop(stack &s,int &e){s.top --;e=*s.top ;return 1;}int getelem(stack s){int e=0;while(s.base !=s.top ){pop(s,e);cout<<e<<" ";}return 1;}int creatstack(stack &s){float e=0,m=1;cout<<"输入0表示结束栈的初始化"<<endl; while(m!=0)//输入0表示结束栈的初始化{cin>>e;if(e!=0)push(s,e);m=e;}return 1;}int convert() //利用栈转化进制函数{int n,m=1,e=0;stack s;initstack(s);cout<<endl<<"输入你要转化的数,0表示结束"<<endl; while(m){cin>>n;m=n;if(n!=0){while(n){push(s,n%N);n=n/N;}while(s.top !=s.base ){pop(s,e);cout<<e;}cout<<endl;}}return 1;}void main(){stack s;initstack(s);creatstack(s);getelem(s);convert();}五、实验结果与分析六、实验心得在调试程序的过程中,感触颇多。
实验报告(一)实验过程一、项目简介进制转换通过编写函数实现十进制浮点数到R进制的转换,在十进制浮点数的整数部分利用栈结构实现,小数部分用队列结构实现。
二、项目实施:1.读取数据并获得小数点位置2.将字符串转为整数形式.3.对整数部分进行入栈4.获得小数部分并入队5.整数和小数的联合输出6.源代码:#include <stdio.h>#include <string.h>#include <math.h>#define size 10 //小数部分大小#define maxsize 20 //整数部分大小//*********************************//*********************************//小数部分——队列typedef struct{char data[10]; //读取转制后的小数部分int front,rear; //队首尾指针}Queue; //循环队列//*********************************//初始化队列void init_Queue(Queue* q){q->front=q->rear=0;}//*********************************//入队int push_Queue(Queue *q,int x){if((q->rear+1)%size==q->front) //判断队满{printf("队列满!不允许入队\n");return 0;}else{q->rear=(q->rear+1) % size;q->data[q->rear]=x;return 1;}}//********************************* //出队int pop_Queue(Queue *q,int *x){if(q->rear==q->front){printf("队空!");return 0;}else{q->front=(q->front+1)%size;*x=q->data[q->front]; //读取队头元素return 1;}}//*********************************//*********************************//整数部分——栈typedef struct{char dataint[100];int top;}Stack;//*********************************//-制空栈void init_Stack(Stack *s){s->top=0;}//*********************************//进栈int push_Stack(Stack *s,int x){if(s->top==maxsize){printf("栈已满!");return 0;}else{s->dataint[s->top]=x; //数据进栈s->top++;return 1;}}//*********************************//出栈int pop_Stack(Stack *s,int *x){if(s->top==0){printf("栈空,无数据可取!");return 0;}else{s->top--;*x=s->dataint[s->top]; //取处数据return 1;}}//********************************* 主程序int main(){//*********************************//读入数据char a[20];int aim;printf("请输入一个十进制浮点数: "); //以字符串形式输入一个浮点数gets(a);printf("请输入目标进制: ");scanf("%d",&aim);if(aim==1) {printf("ERROR! PLEASE INPUT A NUMBER AND IT IS BIGGER THAN 1");return 0;}//*********************************//读取小数点位置int i;int pos;//小数点位置for(i=0;i<strlen(a);++i){if(a[i]=='.'){pos=i;break;}}//*********************************//定义栈对整数部分转化后并入栈Stack ss;init_Stack(&ss);//初始化栈//*********************************//将整数部分转换为 int 型int begin=1;int bnum;if(a[0]=='-') {int bnum = a[1]-'0'; //判断是否为负数begin=2;}else bnum=a[0]-'0';for(i=begin;i<pos;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;}//*********************************//出栈读取整数部分结果int flag,z;flag=pop_Stack(&ss,&z);if(flag==1){printf("目的进制数为: ");for(i=ss.top;i>=0;i--) //先从顶端出栈printf("%d ",ss.dataint[i]);}else printf("无数据!");// printf("\n");//定义队列并将小数部分转化后入队Queue q,*cq=&q;init_Queue(cq);//*********************************//将小数点后面的部分转为浮点数int c=1;int anum=a[pos+1]-'0';for(i=pos+2;i<strlen(a);i++){anum=anum*10+(a[i]-'0');c++;}double small=((double)anum)/pow(10,c); // printf("小数部分:%lf\n",small);//*********************************// 依次求得小数部分的每一位并入队int zz;int innum;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]);}//*********************************return 0;}实验总结通过对数据的单个读取并入栈,后续的出栈顺序为从上到下,先进后出,读取数据后为相反的顺序,而队列的顺序出队为先进先出,对小数的存储可直接进行读取。
一、实验目的掌握栈的基本用法二、实验准备计算机VC++6.0 Win7三、实验内容1、利用栈实现一个十进制数转换为二进制数和十六进制数。
程序:#include<stdio.h>#include <stdlib.h>#include <malloc.h>#define STACKSIZE 100#define ADD 10typedef struct{int *base;int *top;int stacksize;}sqstack;bool Initstack(sqstack &L){ //构造一个空栈L.base=(int *)malloc(STACKSIZE * sizeof(int));if(!L.base)exit(1);L.top=L.base;//空栈的标志L.stacksize=STACKSIZE;return true;}bool Push(sqstack &L,int e){if(L.top - L.base>=L.stacksize){ //栈满,的申请新的空间L.base=(int *)realloc(L.base,(L.stacksize+ADD) *sizeof(int)); //生成新节点if(!L.base)return false;L.top=L.base+L.stacksize; //新基址L.stacksize+=ADD;}*L.top++=e;return true;}bool GetTop(sqstack L,int &e){ //用e返回栈顶元素if(L.base==L.top)return false;e=*(L.top-1);return true;}bool Pop(sqstack & L,int &e){ //删除栈顶元素,并用e返回if(L.base==L.top)return false;e=*--L.top;return true;}bool Clearstake(sqstack &L){ //将栈置空L.base=L.top;return true;}int stackEmpty(sqstack L){ //判断栈是否为空if(L.base==L.top)return 1;else return -1;}bool DestroyStack(sqstack &L){ //销毁栈free(L.base);L.base=NULL;L.top=NULL;L.stacksize=0;return true;}bool Show(sqstack L ){ //将栈的元素全部输出来if(L.base==L.top)return false;printf("栈的元素是:");while(L.top>L.base){printf("%d\n",*(--L.top));}return true;}void change(sqstack &L,int m,int x){int i=0,e,n;n=m;if(x==2){while(n>0){Push(L,n%2);n/=2;i++;}printf("原数");printf("%d",m);printf("转化为二进制为:");for(;i>0;i--){Pop(L,e);printf("%d",e);}printf("\n");}if(x==16){while(n>0){Push(L,n%16);n/=16;i++;}printf("原数");printf("%d",m);printf("转化为十六进制为:");for(;i>0;i--){Pop(L,e);switch(e){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;default:printf("%d",e);break;}}printf("\n");}}int main(){sqstack L;Initstack(L);int m;printf("请输入要转换的数:");scanf("%d",&m);change(L,m,2);change(L,m,16);return 0;}截图:四、实验总结通过本次试验,我对栈的应用有了具体的了解。