东软数据结构实验报告——通过栈和队列来实现进制转换
数据结构实验报告_实验报告_
数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。
数据结构实验报告1一、实验目的及要求1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。
本实验训练的要点是“栈”和“队列”的观点;二、实验内容1) 利用栈,实现数制转换。
2) 利用栈,实现任一个表达式中的语法检查(选做)。
3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);三、实验流程、操作步骤或核心代码、算法片段顺序栈:Status InitStack(SqStack &S){S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top)return OK;return ERROR;}int StackLength(SqStack S){return S.top-S.base;}Status GetTop(SqStack S,ElemType &e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;Status Push(SqStack &S,ElemType e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S){ElemType *p;p=(ElemType *)malloc(sizeof(ElemType));if(!p) return ERROR;p=S.top;while(p!=S.base)//S.top上面一个...p--;printf("%d ",*p);}return OK;}Status Compare(SqStack &S){int flag,TURE=OK,FALSE=ERROR; ElemType e,x;InitStack(S);flag=OK;printf("请输入要进栈或出栈的元素:"); while((x= getchar)!='#'&&flag) {switch (x){case '(':case '[':case '{':if(Push(S,x)==OK)printf("括号匹配成功!\n\n"); break;case ')':if(Pop(S,e)==ERROR || e!='('){printf("没有满足条件\n");flag=FALSE;}break;case ']':if ( Pop(S,e)==ERROR || e!='[')flag=FALSE;break;case '}':if ( Pop(S,e)==ERROR || e!='{')flag=FALSE;break;}}if (flag && x=='#' && StackEmpty(S)) return OK;elsereturn ERROR;}链队列:Status InitQueue(LinkQueue &Q) {Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status QueueEmpty(LinkQueue &Q){if(Q.front->next==NULL)return OK;return ERROR;}Status QueueLength(LinkQueue Q){int i=0;QueuePtr p,q;p=Q.front;while(p->next){i++;p=Q.front;q=p->next;p=q;}return i;}Status GetHead(LinkQueue Q,ElemType &e) {QueuePtr p;p=Q.front->next;if(!p)return ERROR;e=p->data;return e;}Status ClearQueue(LinkQueue &Q){QueuePtr p;while(Q.front->next ){p=Q.front->next;free(Q.front);Q.front=p;}Q.front->next=NULL;Q.rear->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e) {QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode));if(!p)return ERROR;p->data=e;p->next=NULL;Q.rear->next = p;Q.rear=p; //p->next 为空return OK;}Status DeQueue(LinkQueue &Q,ElemType &e) {QueuePtr p;if (Q.front == Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front; //只有一个元素时(不存在指向尾指针) free (p);return OK;}Status QueueTraverse(LinkQueue Q){QueuePtr p,q;if( QueueEmpty(Q)==OK){printf("这是一个空队列!\n");return ERROR;}p=Q.front->next;while(p){q=p;printf("%d<-\n",q->data);q=p->next;p=q;}return OK;}循环队列:Status InitQueue(SqQueue &Q){Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OWERFLOW);Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}int QueueLength(SqQueue Q){return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status DestoryQueue(SqQueue &Q){free(Q.base);return OK;}Status QueueEmpty(SqQueue Q) //判空{if(Q.front ==Q.rear)return OK;return ERROR;}Status QueueTraverse(SqQueue Q){if(Q.front==Q.rear)printf("这是一个空队列!");while(Q.front%MAXQSIZE!=Q.rear){printf("%d<- ",Q.base[Q.front]);Q.front++;}return OK;}数据结构实验报告2一.实验内容:实现哈夫曼编码的生成算法。
数据结构栈和队列实验报告
数据结构栈和队列实验报告实验报告:数据结构栈和队列一、实验目的1.了解栈和队列的基本概念和特点;2.掌握栈和队列的基本操作;3.掌握使用栈和队列解决实际问题的方法。
二、实验内容1.栈的基本操作实现;2.队列的基本操作实现;3.使用栈和队列解决实际问题。
三、实验原理1.栈的定义和特点:栈是一种具有后进先出(LIFO)特性的线性数据结构,不同于线性表,栈只能在表尾进行插入和删除操作,称为入栈和出栈操作。
2.队列的定义和特点:队列是一种具有先进先出(FIFO)特性的线性数据结构,不同于线性表,队列在表头删除元素,在表尾插入元素,称为出队和入队操作。
3.栈的基本操作:a.初始化:建立一个空栈;b.入栈:将元素插入栈的表尾;c.出栈:删除栈表尾的元素,并返回该元素;d.取栈顶元素:返回栈表尾的元素,不删除。
4.队列的基本操作:a.初始化:建立一个空队列;b.入队:将元素插入队列的表尾;c.出队:删除队列表头的元素,并返回该元素;d.取队头元素:返回队列表头的元素,不删除。
四、实验步骤1.栈的实现:a.使用数组定义栈,设置栈的大小和栈顶指针;b.实现栈的初始化、入栈、出栈和取栈顶元素等操作。
2.队列的实现:a.使用数组定义队列,设置队列的大小、队头和队尾指针;b.实现队列的初始化、入队、出队和取队头元素等操作。
3.使用栈解决实际问题:a.以括号匹配问题为例,判断一个表达式中的括号是否匹配;b.使用栈来实现括号匹配,遍历表达式中的每个字符,遇到左括号入栈,遇到右括号时将栈顶元素出栈,并判断左右括号是否匹配。
4.使用队列解决实际问题:a.以模拟银行排队问题为例,实现一个简单的银行排队系统;b.使用队列来模拟银行排队过程,顾客到达银行时入队,处理完业务后出队,每个顾客的业务处理时间可以随机确定。
五、实验结果与分析1.栈和队列的基本操作实现:a.栈和队列的初始化、入栈/队、出栈/队以及取栈顶/队头元素等操作均能正常运行;b.栈和队列的时间复杂度均为O(1),操作效率很高。
数据结构实验报告 栈进制转换
数据结构实验报告栈进制转换数据结构实验报告栈进制转换一、实验目的栈是一种常见的数据结构,本实验的目的在于通过实现栈的基本操作,设计并实现一个进制转换的程序,并通过实验验证程序的正确性和效率。
二、实验原理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.本实验的结果表明,转换程序能够正确地将十进制数转换为目标进制数,并且具有较高的效率。
数据结构栈和队列实验报告
数据结构栈和队列实验报告数据结构栈和队列实验报告1.实验目的本实验旨在通过设计栈和队列的数据结构,加深对栈和队列的理解,并通过实际操作进一步掌握它们的基本操作及应用。
2.实验内容2.1 栈的实现在本实验中,我们将使用数组和链表两种方式实现栈。
我们将分别实现栈的初始化、入栈、出栈、判断栈是否为空以及获取栈顶元素等基本操作。
通过对这些操作的实现,我们可将其用于解决实际问题中。
2.2 队列的实现同样地,我们将使用数组和链表两种方式实现队列。
我们将实现队列的初始化、入队、出队、判断队列是否为空以及获取队头元素等基本操作。
通过对这些操作的实现,我们可进一步了解队列的特性,并掌握队列在实际问题中的应用。
3.实验步骤3.1 栈的实现步骤3.1.1 数组实现栈(详细介绍数组实现栈的具体步骤)3.1.2 链表实现栈(详细介绍链表实现栈的具体步骤)3.2 队列的实现步骤3.2.1 数组实现队列(详细介绍数组实现队列的具体步骤)3.2.2 链表实现队列(详细介绍链表实现队列的具体步骤)4.实验结果与分析4.1 栈实验结果分析(分析使用数组和链表实现栈的优缺点,以及实际应用场景)4.2 队列实验结果分析(分析使用数组和链表实现队列的优缺点,以及实际应用场景)5.实验总结通过本次实验,我们深入了解了栈和队列这两种基本的数据结构,并利用它们解决了一些实际问题。
我们通过对数组和链表两种方式的实现,进一步加深了对栈和队列的理解。
通过实验的操作过程,我们也学会了如何设计和实现基本的数据结构,这对我们在日后的学习和工作中都具有重要意义。
6.附件6.1 源代码(附上栈和队列的实现代码)6.2 实验报告相关数据(附上实验过程中所产生的数据)7.法律名词及注释7.1 栈栈指的是一种存储数据的线性数据结构,具有后进先出(LIFO)的特点。
栈的操作主要包括入栈和出栈。
7.2 队列队列指的是一种存储数据的线性数据结构,具有先进先出(FIFO)的特点。
SDUT2131数据结构实验之栈与队列一:进制转换
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****************************************************/。
数据结构栈和队列实验报告
num=Pop(top);
printf("%d",num);
}
printf("\n");
}
void Push(LinkStack *top,DataType x) /*压栈操作*/
i--;
}
q->rear->next=p;
q->rear=p;
}
void PutQ(LinkQueue *q,int i,int t)
{
int j=t-i-1;
p=q->front->next;
while(j){printf(" ");j--;}
scanf("%d",&t);
top=(LinkStack*)malloc(sizeof(LinkStack));
IniStack(top);
while(num!=0){
Push(top,num%t);
num=num/t;
}
printf("转化后的数为:");
数据结构栈和队列实验报告
(以下写实验内容、分析与程序清单、调试报告等)
一、 实验目的
1.掌握栈这种数据结构特性及其主要存储结构,并能在现实生活中灵活运用。
2.掌握队列这种数据结构特性及其主要存储结构并能在现实生活中灵活运用。
}
}
return 0;
栈和队列及其应用实验报告
数据结构实验报告实验名称:栈和队列及其应用班级: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;}实验总结通过对数据的单个读取并入栈,后续的出栈顺序为从上到下,先进后出,读取数据后为相反的顺序,而队列的顺序出队为先进先出,对小数的存储可直接进行读取。
数据结构栈与队列的实验报告
s->stacksize=stack_init_size;
return 1;
int Push(sqst->base>=s->stacksize)
{
s->base=(int *)realloc(s->base,(s->stacksize+stackincrement)*sizeof(int));
实验三 栈与队列
一、实验目的:
(1)熟练掌握栈和队列的结构以及这两种数据结构的特点、栈与队列的基 本操作。
(2)能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判 断条件及描述方法;
(3)熟练掌握链队列和循环队列的基本运算,并特别注意队列满和队列空 的判断条件和描述方法;
(4)掌握栈的应用;
if(!s->base)
return 0;
s->top=s->base+s->stacksize;
s->stacksize+=stackincrement;
*(s->top++)=e;
return e;
}
int Pop(sqstack *s,int e)
{
if(s->top==s->base)
return 0;
while(!stackempty(s)) { e=Pop(s,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;
实验三 栈和队列
实验报告三栈和队列一、实验目的:(1)掌握栈的基本操作的实现方法。
(2)利用栈先进后出的特点,解决一些实际问题。
(3)掌握链式队列及循环队列的基本操作算法。
(4)应用队列先进先出的特点,解决一些实际问题。
二、实验内容:1、使用一个栈,将一个十进制转换成二进制。
粘贴源程序:package Q1;public class SeqStack {public int element[];public int top;public static SeqStack p;public SeqStack(int size){this.element=new int[size];this.top=-1;}public void push(int x){this.top++;this.element[this.top]=x;}public int pop(){return this.top==-1 ? -1: (int)this.element[this.top--];}public int get(){return this.top==-1 ? -1: (int)this.element[this.top];}public static void disp(SeqStack p){int t = -2;while(t!=-1){t=p.pop();if(t!=-1)System.out.printf("%d",t);}}public static void fun(int x){int t;while(x!=1){t=x%2;x=x/2;p.push(t);}if(x==1)p.push(x);}public static void main(String args[]){p=new SeqStack(13);fun(99);disp(p);}}粘贴测试数据及运行结果:2、回文是指正读反读均相同的字符序列,如“acdca”、“dceecd”均是回文,但“book”不是回文。
实验报告——栈和队列的应用
实验报告——栈和队列的应用第一篇:实验报告——栈和队列的应用实验5 栈和队列的应用目的和要求:(1)熟练栈和队列的基本操作;(2)能够利用栈与队列进行简单的应用。
一、题目题目1.利用顺序栈和队列,实现一个栈和一个队列,并利用其判断一个字符串是否是回文。
所谓回文,是指从前向后顺读和从后向前倒读都一样的字符串。
例如,a+b&b+a等等。
题目2.假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。
跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。
若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
现要求写一算法模拟上述舞伴配对问题,并实现。
题目3.打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。
每台打印机具有一个队列(缓冲池),用户提交打印请求被写入到队列尾,当打印机空闲时,系统读取队列中第一个请求,打印并删除之。
请利用队列的先进先出特性,完成打印机网络共享的先来先服务功能。
题目4.假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag == 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。
试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。
题目5.利用循环链队列求解约瑟夫环问题。
请大家从本组未讨论过的五道题中选择一道,参照清华邓俊辉老师MOOC视频及课本相关知识,编写相应程序。
选择题目3:打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。
二、程序清单//Ch3.cpp #include #include #include“ch3.h” template void LinkedQueue::makeEmpty()//makeEmpty//函数的实现{ LinkNode*p;while(front!=NULL)//逐个删除队列中的结点{p=front;front=front->link;delete p;} };template bool LinkedQueue::put_in(T&x){//提交命令函数if(front==NULL){//判断是否为空front=rear=new LinkNode;//如果为空,新结点为对头也为对尾front->data=rear->data=x;if(front==NULL)//分配结点失败return false;} else{rear->link=new LinkNode;//如不为空,在链尾加新的结点rear->link->data=x;if(rear->link==NULL)return false;rear=rear->link;} return true;};template bool LinkedQueue::carry_out()//执行命令函数 { if(IsEmpty()==true)//判断是否为空{return false;} cout<data<LinkNode*p=front;front=front->link;//删除以执行的命令,即对头修改delete p;//释放原结点return true;};void main()//主函数 { LinkedQueue q;//定义类对象char flag='Y';//标志是否输入了命令const int max=30;//一次获取输入命令的最大个数while(flag=='Y')//循环{ int i=0;char str[max];//定义存储屏幕输入的命令的数组gets(str);//获取屏幕输入的命令while(str[i]!=''){q.put_in(str[i]);//调用提交命令函数,将每个命令存入队列中i++;}for(int j=0;j<=i;j++){if(q.IsEmpty()==true)//判断是否为空,为空则说明没有可执行的命令{cout<cin>>flag;continue;//为空跳出for循环为下次输入命令做好准备}q.carry_out();//调用执行命令的函数,将命令打印并删除}三、程序调试过程中所出现的错误无。
数据结构实验报告-栈进制转换
数据结构实验报告-栈进制转换数据结构实验报告栈进制转换一、实验目的本实验旨在通过使用栈这种数据结构,实现不同进制之间的转换,加深对栈的基本概念、操作和应用的理解,提高编程能力和问题解决能力。
二、实验环境操作系统:Windows 10编程语言:C++开发工具:Visual Studio 2019三、实验原理进制转换是将一个数从一种进制表示形式转换为另一种进制表示形式的过程。
常见的进制有二进制、八进制、十进制和十六进制。
栈是一种特殊的线性表,它遵循“后进先出”(Last In First Out,LIFO)的原则。
在进制转换中,可以利用栈来存储转换过程中的余数,从而实现进制的转换。
以十进制转换为二进制为例,将十进制数除以 2 取余数,然后将商继续除以 2 取余数,直到商为 0。
将依次得到的余数从栈中取出,即可得到对应的二进制数。
四、实验内容与步骤(一)数据结构定义```cppclass Stack {private:int stackArray;int top;int capacity;public:Stack(int size) {capacity = size;stackArray = new intcapacity;top =-1;}~Stack(){delete stackArray;}void push(int element) {if (isFull()){std::cout <<"Stack Overflow" << std::endl; return;}stackArray++top = element;}int pop(){if (isEmpty()){std::cout <<"Stack Underflow" << std::endl; return -1;}return stackArraytop;}int peek(){if (isEmpty()){std::cout <<"Stack is empty" << std::endl; return -1;}return stackArraytop;}bool isEmpty(){return top ==-1;}bool isFull(){return top == capacity 1;}};```(二)十进制转二进制函数```cppvoid decimalToBinary(int decimalNumber) {Stack stack(32);while (decimalNumber > 0) {int remainder = decimalNumber % 2;stackpush(remainder);decimalNumber /= 2;}std::cout <<"十进制"<< decimalNumber <<"转换为二进制为: ";while (!stackisEmpty()){std::cout << stackpop();}std::cout << std::endl;}```(三)十进制转八进制函数```cppvoid decimalToOctal(int decimalNumber) {Stack stack(16);while (decimalNumber > 0) {int remainder = decimalNumber % 8;stackpush(remainder);decimalNumber /= 8;}std::cout <<"十进制"<< decimalNumber <<"转换为八进制为: ";while (!stackisEmpty()){std::cout << stackpop();}std::cout << std::endl;}```(四)十进制转十六进制函数```cppvoid decimalToHexadecimal(int decimalNumber) {Stack stack(16);while (decimalNumber > 0) {int remainder = decimalNumber % 16;if (remainder < 10) {stackpush(remainder +'0');} else {stackpush(remainder 10 +'A');}decimalNumber /= 16;}std::cout <<"十进制"<< decimalNumber <<"转换为十六进制为: ";while (!stackisEmpty()){std::cout << stackpop();}std::cout << std::endl;}```(五)主函数```cppint main(){int decimalNumber;std::cout <<"请输入一个十进制数: ";std::cin >> decimalNumber; decimalToBinary(decimalNumber);decimalToOctal(decimalNumber);decimalToHexadecimal(decimalNumber);return 0;}```五、实验结果与分析(一)实验结果输入十进制数 25,得到以下结果:二进制:11001八进制:31十六进制:19(二)结果分析通过实验,成功实现了将十进制数转换为二进制、八进制和十六进制。
数据结构栈和队列实验报告
数据结构栈和队列实验报告南京信息⼯程⼤学实验(实习)报告实验(实习)名称栈和队列⽇期2017.11.8 得分指导⽼师崔萌萌系计算机系专业软件⼯程年级2016 班次(1) 姓名学号⼀、实验⽬的1、学习栈的顺序存储和实现,会进⾏栈的基本操作2、掌握递归3、学习队列的顺序存储、链式存储,会进⾏队列的基本操作4、掌握循环队列的表⽰和基本操作⼆、实验内容1、⽤栈解决以下问题:(1)对于输⼊的任意⼀个⾮负⼗进制数,显⽰输出与其等值的⼋进制数,写出程序。
(2)表达式求值,写出程序。
2、⽤递归写出以下程序:(1)求n!。
(2)汉诺塔程序,并截图显⽰3、4、5个盘⼦的移动步骤,写出移动6个盘⼦的移动次数。
3、编程实现:(1)创建队列,将asdfghjkl依次⼊队。
(2)将队列asdfghjkl依次出队。
4、编程实现创建⼀个最多6个元素的循环队列、将ABCDEF依次⼊队,判断循环队列是否队满。
三、实验步骤1.栈的使⽤1.1 ⽤栈实现进制的转换:代码如下:#include#includeusing namespace std;int main(){stack s; //栈s;int n,radix;printf("请输⼊要转换的⼗进制⾮负整数: ");scanf("%d",&n);printf("请输⼊⽬标进制: ");scanf("%d",&radix);printf("转换为%d进制: ",radix);while(n) {s.push(n%radix);n /= radix;}while(!s.empty()) { //⾮空printf("%d",s.top());s.pop();}printf("\n");return 0;}运⾏结果如下:2.2 求表达式的值代码如下:#include#include#include#include#define true 1#define false 0#define OPSETSIZE 8typedef int Status;unsigned char Prior[8][8] = { //运算符优先级表// '+' '-' '*' '/' '(' ')' '#' '^'/*'+'*/ '>','>','<','<','<','>','>','<',/*'-'*/ '>','>','<','<','<','>','>','<',/*'*'*/ '>','>','>','>','<','>','>','<',/*'/'*/ '>','>','>','>','<','>','>','<',/*'('*/ '<','<','<','<','<','=',' ','<',/*')'*/ '>','>','>','>',' ','>','>','>',/*'#'*/ '<','<','<','<','<',' ','=','<',/*'^'*/ '>','>','>','>','<','>','>','>'};typedef struct StackChar { //StackChar类型的结点SC char c;struct StackChar *next;}SC;struct StackFloat *next;}SF;SC* Push(SC* s,char c) //SC类型的指针Push,返回p{SC* p = (SC* )malloc(sizeof(SC));p->c = c;p->next = s;return p;}SF* Push(SF* s,float f) //SF类型的指针Push,返回p{SF* p = (SF* )malloc(sizeof(SF));p->f = f;p->next = s;return p;}SC* Pop(SC* s) //SC类型的指针Pop{SC* q = s;s = s->next;free(q);return s;}SF* Pop(SF* s) //SF类型的指针Pop{SF* q = s;s = s->next;free(q);return s;}float Operate(float a,unsigned char theta, float b) //计算函数Operate { switch(theta){case '+': return a+b;case '-': return a-b;case '*': return a*b;case '/': return a/b;case '^': return pow(a,b);default : return 0;}char OPSET[OPSETSIZE] = {'+','-','*','/','(',')','#','^'};Status In(char Test,char *TestOp){int Find = false;for (int i=0; i< OPSETSIZE; i++) {if(Test == TestOp[i]) Find = true;}return Find;}Status ReturnOpOrd(char op,char *TestOp){for(int i=0; iif(op == TestOp[i]) return i;}}char precede(char Aop, char Bop){return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];}float EvaluateExpression(char* MyExpression)//表达式的运算符优先算法{//OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合SC* OPTR = NULL; //运算符栈,字符元素SF* OPND = NULL; //运算数栈,实数元素char TempData[20];float Data,a,b;char theta, *c, Dr[] = {'#','\0'};OPTR = Push(OPTR,'#');c = strcat(MyExpression,Dr);strcpy(TempData,"\0"); //字符串拷贝函数while (*c != '#' || OPTR->c != '#') {if (!In(*c, OPSET)) {Dr[0] = *c;strcat(TempData,Dr); //字符串连接函数c++;if (In(*c, OPSET)) {Data = atof(TempData); //字符串转换函数(double) OPND = Push(OPND, Data); strcpy(TempData,"\0");}} else { //不是运算符则进栈switch (precede(OPTR->c, *c))case '<': //栈顶元素优先级低OPTR=Push(OPTR, *c); c++; break;case '=': //去括号并接收下⼀字符OPTR = Pop(OPTR); c++; break;case '>': //退栈并将运算结果⼊栈theta = OPTR->c; OPTR = Pop(OPTR);b = OPND->f; OPND = Pop(OPND);a = OPND->f; OPND = Pop(OPND);OPND = Push(OPND, Operate(a, theta, b)); break;}}}return OPND->f;}int main(){char s[128];printf("请输⼊表达式: \n");scanf("%s",s);printf("该表达式的值为: \n");printf("%s = ",s);printf("%g\n",EvaluateExpression(s)); // %g return 0; }运⾏结果如下:2.递归的使⽤2.1 求n!:代码如下:#includeint Fact(int n){if(0 == n) return 1;else return n*Fact(n-1);}{int n;scanf("%d",&n);printf("%d的阶乘为:",n);printf("%d",Fact(n));return 0;}运⾏结果如下:2.2 哈诺塔:代码如下:#includeint Hanoi(int n,char a,char b,char c) { if(1 == n)printf("%c-%d->%c ",a,1,c);else{Hanoi(n-1,a,c,b);printf("%c-%d->%c ",a,n,c);Hanoi(n-1,b,a,c);}return 0;}int main(){int n;char a='A',b='B',c='C';printf("请输⼊汉诺塔的层数: "); scanf("%d",&n);Hanoi(n,a,b,c);printf("\n");return 0;}运⾏结果如下:n=3时n=4时n=5时n=6时由3,4,5可推知n 层哈诺塔需要移动 12 n次;n=6时,需要移动63次。
数据结构栈和队列实验报告
数据结构栈和队列实验报告数据结构栈和队列实验报告1.引言本实验旨在通过设计和实现栈和队列的数据结构,掌握栈和队列的基本操作,并进一步加深对数据结构的理解和应用。
2.实验目的本实验的主要目标包括:________●掌握栈和队列的数据结构实现。
●熟悉栈和队列的基本操作:________入栈、出栈、入队、出队。
●理解栈和队列的应用场景,并能够灵活运用。
3.实验原理3.1 栈栈是一种特殊的数据结构,它采用“后进先出”的方式对元素进行操作。
栈的主要操作包括入栈和出栈,入栈将元素压入栈顶,出栈将栈顶元素弹出。
3.2 队列队列也是一种特殊的数据结构,它采用“先进先出”的方式对元素进行操作。
队列的主要操作包括入队和出队,入队将元素放入队列尾部,出队将队列头部的元素移除。
4.实验过程4.1 栈的实现a. 定义栈的数据结构在实现栈之前,首先要定义栈的数据结构,包括数据存储结构和相关操作方法。
b. 定义入栈操作入栈操作将元素压入栈顶。
c. 定义出栈操作出栈操作将栈顶元素弹出。
4.2 队列的实现a. 定义队列的数据结构在实现队列之前,首先要定义队列的数据结构,包括数据存储结构和相关操作方法。
b. 定义入队操作入队操作将元素放入队列尾部。
c. 定义出队操作出队操作将队列头部的元素移除。
5.实验结果与分析将栈和队列的数据结构实现后,可以进行测试和验证。
通过将不同类型的元素入栈和入队,然后再进行出栈和出队操作,最后检查栈和队列的状态,验证其正确性。
6.实验总结本实验通过设计和实现栈和队列的数据结构,掌握了栈和队列的基本操作。
并通过对栈和队列的应用,加深了对数据结构的理解和应用。
附件:________无法律名词及注释:________无。
栈和队列实验报告
栈和队列实验报告引言:计算机科学中的数据结构是解决问题的关键。
栈和队列这两种常用的数据结构,无疑在许多实际应用中起着重要的作用。
本篇报告旨在探讨栈和队列的实验结果,并展示它们的实际应用。
一、栈的实验结果及应用1. 栈的实验结果在实验中,我们设计了一个基于栈的简单计算器,用于实现基本的四则运算。
通过栈的先进后出(Last In First Out)特性,我们成功实现了表达式的逆波兰表示法,并进行了正确的计算。
实验结果表明,栈作为一个非常有效的数据结构,可以很好地处理栈内数据的存储和检索。
2. 栈的应用栈在计算机科学中有许多实际应用。
其中之一是程序调用的存储方式。
在程序调用过程中,每个函数的返回地址都可以通过栈来保存和恢复。
另一个应用是浏览器的历史记录。
浏览器中每个访问网页的URL都可以通过栈来存储,以便用户能够追溯他们之前访问的网页。
二、队列的实验结果及应用1. 队列的实验结果在实验中,我们模拟了一个简单的出租车调度系统,利用队列的先进先出(First In First Out)特性实现乘客的排队和叫车。
实验结果表明,队列作为一个具有高效性和可靠性的数据结构,能够很好地处理排队问题。
2. 队列的应用队列在许多方面都有应用。
一个常见的应用是消息队列。
在网络通信中,消息队列可以用于存储和传递信息,确保按照特定的顺序进行处理。
另一个应用是操作系统的进程调度。
操作系统使用队列来管理各个进程的执行顺序,以实现公平和高效的资源分配。
三、栈和队列的比较及选择1. 效率比较栈和队列在实际应用中的效率取决于具体问题的需求。
栈的操作更简单,仅涉及栈顶元素的插入和删除,因此具有更高的执行速度。
而队列涉及到队头和队尾元素的操作,稍复杂一些。
但是,队列在某些问题中的应用更为广泛,例如调度问题和消息传递问题。
2. 如何选择在选择栈和队列时,需要根据实际问题的性质和需求进行综合考虑。
如果问题需要追溯历史记录或按照特定顺序进行处理,则应选择栈作为数据结构。
数据结构之进制转换
算法与数据结构实验报告实验三实验名称:栈和队列—进制转换姓名:X X X学号:211106365专业:软件工程班级:X班指导教师:X X X日期: 2013年月日一、实验目的学会应用栈或队列解决进制转换问题,熟练掌握在顺序栈(队列)或链栈(队列)上实现的各种基本操作。
二、实验内容与实验步骤内容:利用栈实现十进制和其他任意进制数的任意转换输出问题进制转换原理:N = (N div d) *d + N mod d(其中:div 为整除运算,mod 为求余运算)步骤: 1 定义栈数据类型,采用链式存储结构实现2 链栈基本操作函数原型声明3 初始化栈4 输入栈5 输出栈6 判空栈7 自定义实现进制转换函数8 数据调试9 程序结束三、实验环境操作系统winXP、开发平台:Microsoft Visual C++6.0四、实验过程与分析程序设计过程中忘了考虑到开始报数的数不能超过最大编号;而导致程序的健壮性不足,经修改后,解决了这一问题;五、实验结论(1348)10 = (2504)8(11)10 = (B)16(8)10 = (1000)2六、附录#define STACK_INIT_SIZE 100 //存储空间初始分配量#define STACKINCREMENT 10 //存储空间分配增量#define ERROR 0#define OVERFLOW -2#include <stdio.h>#include<malloc.h>#include<process.h>typedef int SElemType;typedef struct{SElemType *base;// 在栈构造之前和销毁之后,base 的值为NULLSElemType *top;// 栈顶指针int StackSize; //当前已分配的存储空间,以元素为单位}SqStack;void InitStack(SqStack *s) //初始化栈{s->base =(SElemType*)malloc (STACK_INIT_SIZE * sizeof(SElemType));if(!s->base) exit(OVERFLOW);s->top=s->base;s->StackSize= STACK_INIT_SIZE;}void Push(SqStack *s,SElemType e) // 输入栈{if (s->top-s->base>=s->StackSize){s->base=(SElemType *) realloc (s->base,(s->StackSize+STACKINCREMENT)*sizeof(SElemType)); //栈满,追加存储空间if(!s->base) exit(OVERFLOW); //若内存中没有s->StackSize+STACKINCREMENT个连续空间则分配失败s->top=s->base+s->StackSize;s->StackSize+=STACKINCREMENT;}*s->top++ =e;}int Pop(SqStack *s,SElemType *e) //输出栈{if (s->top==s->base)return ERROR;s->top=s->top-1;*e = *s->top;}int StackEmpty(SqStack s) //判空栈{if (s.top ==s.base)return 1;elsereturn 0;}void Conversion(int N,int m){SElemType e;SqStack s;InitStack(&s);while(N){Push(&s,N%m);N= N/m;}printf("转换后的%d进制数为:",m);while(StackEmpty(s)!=1){Pop(&s,&e);if(e>=10)printf("%c",e-10+'A');elseprintf("%d",e);}printf("\n");}void main(){int n,m;printf("请输入一个十进制数: ");scanf("%d",&n);printf("需要转成的进制m:");scanf("%d",&m);Conversion(n,m);}。
数据结构栈和队列实验报告简版
数据结构栈和队列实验报告数据结构栈和队列实验报告1. 实验目的本实验的主要目的是通过实践的方式理解并掌握数据结构中栈和队列的概念、特点和基本操作。
通过实验,我们可以加深对栈和队列的理解,掌握栈和队列的应用方法,并能够设计和实现基于栈和队列的算法。
2. 实验内容本实验分为两个部分:栈的应用和队列的应用。
2.1 栈的应用栈是一种具有特定限制的线性表,它只允许在表的一端进行插入和删除操作,该端被称为栈顶。
栈的特点是“后进先出”(Last In First Out, LIFO),即最后进栈的元素最先出栈。
在本实验中,我们将实现一个简单的栈类,并应用栈来解决一个问题。
假设有一个字符串,其中包含了括号(圆括号、方括号和花括号),我们需要判断该字符串中的括号是否匹配。
为了达到这个目的,我们可以使用栈来辅助实现。
在实现过程中,我们可以定义一个栈来存储左括号,然后依次遍历字符串的每个字符。
当遇到左括号时,将其入栈;当遇到右括号时,判断栈顶是否是对应的左括号,如果是,则将栈顶元素出栈,否则说明括号不匹配。
最后,当栈为空时,表明所有的括号都匹配,否则说明括号不匹配。
2.2 队列的应用队列是一种具有特定限制的线性表,它只允许在表的一端进行插入操作(队尾),在表的另一端进行删除操作(队头)。
队列的特点是“先进先出”(First In First Out, FIFO),即最早进队列的元素最先出队列。
在本实验中,我们将实现一个简单的队列类,并应用队列来解决一个问题。
假设有一群人在排队等候,我们需要按照一定规则进行排队并输出结果。
为了达到这个目的,我们可以使用队列来进行模拟。
在实现过程中,我们可以定义一个队列来存储等候的人,然后依次将人入队列。
当需要输出结果时,我们可以通过队列的出队列操作,按照先后顺序依次输出到达队头的人。
通过使用队列,我们可以模拟人们排队等候的实际情况,并能够按照一定规则输出结果。
3. 实验过程本实验的实验过程如下:1. 首先,我们需要实现一个栈类。
数据结构栈和队列实验报告
数据结构栈和队列实验报告数据结构栈和队列实验报告引言:数据结构是计算机科学中非常重要的一个概念,它用于组织和存储数据,以便于程序的运行和管理。
栈和队列是数据结构中最基本的两种形式之一,它们在实际应用中有着广泛的应用。
本实验旨在通过实际操作和观察,深入理解栈和队列的特性和应用。
一、实验目的:1. 了解栈和队列的基本概念和特性;2. 掌握栈和队列的基本操作;3. 理解栈和队列在实际应用中的作用。
二、实验过程:本次实验我们使用Python语言来实现栈和队列的操作。
首先,我们定义了栈和队列的类,并编写了相应的操作方法。
1. 栈的实现:栈是一种后进先出(LIFO)的数据结构,类似于我们日常生活中的弹簧簿记本。
我们首先定义了一个栈类,其中包括了栈的初始化、入栈、出栈、获取栈顶元素等方法。
通过这些方法,我们可以对栈进行各种操作。
2. 队列的实现:队列是一种先进先出(FIFO)的数据结构,类似于我们日常生活中的排队。
我们同样定义了一个队列类,其中包括了队列的初始化、入队、出队、获取队首元素等方法。
通过这些方法,我们可以对队列进行各种操作。
三、实验结果:我们通过实验,成功实现了栈和队列的基本操作。
在测试过程中,我们发现栈和队列在实际应用中有着广泛的用途。
1. 栈的应用:栈在计算机系统中有着重要的作用,例如在函数调用中,每次函数调用时都会将返回地址和局部变量等信息存储在栈中,以便于函数执行完毕后能够正确返回。
此外,栈还可以用于表达式求值、括号匹配等场景。
2. 队列的应用:队列在操作系统中常用于进程调度,通过维护一个就绪队列,操作系统可以按照一定的策略选择下一个要执行的进程。
此外,队列还可以用于消息传递、缓冲区管理等场景。
四、实验总结:通过本次实验,我们深入了解了栈和队列的特性和应用。
栈和队列作为数据结构中最基本的两种形式,它们在计算机科学中有着广泛的应用。
在实际编程中,我们可以根据具体的需求选择合适的数据结构,以提高程序的效率和可读性。
数据结构栈和队列实验报告
e=s->data[s->top];//取栈顶指针元素的元素
return true;
}
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct
{
ElemType data[MaxSize];
{LiStack *p;
if (s->next==NULL)//栈空的情况
return false;
p=s->next;//p指向开始节点
e=p->data;
s->next=p->next;//删除*p节点
free(p);//释放*p节点
return true;
}
bool GetTop(LiStack *s,ElemType &e)//取栈顶元素
GetTop(LiStack *s,ElemType &e)//取栈顶元素
对应的程序如下:
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct linknode
{
ElemType data;//数据域
ElemType data;//数据域
{if (s->next==NULL)//栈空的情况
return false;
e=s->next->data;
return true;
}
设计exp3-2.cpp主程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告(一)
实验过程
一、项目简介
进制转换
通过编写函数实现十进制浮点数到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;
}
实验总结
通过对数据的单个读取并入栈,后续的出栈顺序为从上到下,先进后出,读取数据后为相反的顺序,而队列的顺序出队为先进先出,对小数的存储可直接进行读取。