数据结构栈十进制转八进制的算法详解已测试过

数据结构栈十进制转八
进制的算法详解已测试

集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)
实验目的
建立栈实现十进制转八进制
实验内容
编程序并上机调试运行。
建立栈实现十进制转八进制
1.编写程序
//十进制转八进制
#include
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct {
int *base;
int *top;
int stacksize;
}sqstack;
int initstack (sqstack *s)
{s->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));
if(!s->base)
exit(0);
s->top=s->base;
s->stacksize =STACK_INIT_SIZE ;
return 0;
}//构造一个空栈s
int push(sqstack *s,int e)
{ if((s->top-s->base)>=s->stacksize){
s->base=(int*)realloc(s->base,(s->stacksize +
STACKINCREMENT )*sizeof(int));
if(!(s->base)) exit(1);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=e;
return 0;
}//插入新的元素e为新的栈顶元素
int stackempty (sqstack *s)
{if(s->top==s->base)
return 1;
else return 0;
}//若栈s为空栈,则返回1,否则返回0
int pop (sqstack *s,int *e)
{if(s->top==s->base)
return 1;
*e=*--s->top;
return 0;
}//若栈不为空,则删除s的栈顶元素,用e返回其值,返回OK,否
则返回ERROR
void conversion (int n)
{ sqstack s;
int e;
initstack(&s);
printf("请输入一个十进制数:\n");
scanf("%d",&n);
while (n){
push(&s,n%8);
n=n/8;
}
printf("\n");
printf("该数的八进制数为:\n");
while(!stackempty(&s)){
pop(&s,&e);
printf("%d",e);
}
printf("\n");
}//对于输入的任意一个非负十进制整数,打印出与其等值的八进制

int main()
{
int n;
//sqstack *s;
// initstack(s);
conversion (n);
return 0;
}//主函数
运行程序:
程序解析:
1.首先是将程序的开头写好,要有#include,然后定义
STACK_INIT_SIZE 为100 ,STACKINCREMENT为 10。
定义栈顶和栈底都为int型,并且stacksize为int型。
2.构建一个空栈。
建立一个空栈,但建立不成功是就强制退出,建立成功时就使栈顶和栈
顶指向同一个点,并且分配预定长度的节给stacksize。
3.插入新的元素e为新的栈顶元素
插入一个新的元素到栈里,如果长度超过栈的长度,则重新分配新的空
间给sqstack。如果栈底部存在则发生错误,意外退出。然后让e插入成
为新的栈顶元素。
4.判断栈是否为空栈。
该函数用stackempty表示,如果栈顶等于栈底,则栈为空栈,返回1,
否则返回0.
5.取出栈顶元素
若栈为空,则返回1,若栈不为空,则让e指向s的栈顶元素,删除s的
栈顶元素,用e返回其值。
6.建立conversion函数
定义一个空栈s,然后scanf输入一个数,当该数不为0时,就执行
push函数和n=n/8,如果n=0则跳出循环。然后当栈不为空时,将栈顶
一个一个取出,得到的为原十进制数的八进制数。
7.建立main函数。
这里的main函数只要三句话就够了。定义n,和调用conversion函数,
return 0.

合集下载

十进制转八进制c语言

十进制转八进制c语言

十进制转八进制C语言
简介
在计算机科学中,数字通常以十进制表示,即使用0-9的数字进行计数。

而在计算机底层,二进制是最基本的表示方式,只使用0和1两个数字。

但在实际编程中,有时需要将十进制数转换为其他进制,比如八进制。

C语言作为一种常用的编程语言,提供了快速和简单的方法来进行十进制到八进制的转换。

实现
在C语言中,可以使用一种迭代的方式将十进制数转换为八进制。

下面是一个简单的C语言函数,可以实现十进制到八进制的转换:
```c #include <stdio.h>
void decimalToOctal(int decimal) { int octal[100]; int index = 0;
while (decimal > 0) {
octal[index] = decimal % 8;
decimal /= 8;
index++;
}
printf(\。

十进制转八进制c语言

十进制转八进制c语言

十进制转八进制c语言概述在计算机科学中,数制转换是一个重要的基础知识。

十进制转八进制是其中的一种常见转换方式。

在本文中,我们将学习如何使用C语言编写一个能够实现十进制转八进制的程序。

原理解析要将十进制数转换为八进制数,我们需要了解两个数制之间的转换规则。

在十进制系统中,每一位的权值分别为10的0次方、10的1次方、10的2次方…以此类推。

而在八进制系统中,每一位的权值分别为8的0次方、8的1次方、8的2次方…以此类推。

将十进制数转换为八进制数的步骤如下: 1. 将十进制数不断除以8,直到商为0为止,得到的余数就是八进制数的最低位。

2. 将得到的余数由下往上依次排列,得到的数就是八进制数。

程序设计为了实现十进制转八进制的功能,我们将采用逐步除法法实现。

具体的C代码如下所示:#include <stdio.h>void decimalToOctal(int decimal) {int octalNum[100];int i = 0;while (decimal != 0) {octalNum[i] = decimal % 8;decimal = decimal / 8;i++;}printf("转换为八进制的结果为:");for (int j = i - 1; j >= 0; j--) {printf("%d", octalNum[j]);}}int main() {int decimal;printf("请输入一个十进制数:");scanf("%d", &decimal);decimalToOctal(decimal);return 0;}程序解析让我们一步一步地解析上述代码。

首先,我们定义了一个名为decimalToOctal的函数,该函数用于将十进制数转换为八进制数。

我们使用了一个整型数组octalNum来存储转换后的八进制数,数组的大小设定为100,可根据需要进行调整。

十进制转八进制c语言

十进制转八进制c语言

十进制转八进制c语言十进制转八进制是一种常见的数值转换方法,在C语言中可以非常简单地实现,让我们来看看如何进行这个转换。

首先,需要明确的是十进制和八进制之间的转换规律。

在十进制数转换成八进制数时,我们可以将其每三位一组分离出来,每组数字按权值相加得到对应的八进制数。

例如,十进制数734对应的八进制数为1326,其中:7 x 10^2 + 3 x 10^1 + 4 x 10^0 = 1 x 8^3 + 3 x 8^2 + 2 x 8^1 + 6 x 8^0知道了这个规律之后,我们就可以开始写C语言代码了。

具体而言,可以使用while循环来不断从输入中读取十进制数,然后将其转换成八进制数并输出。

代码如下:```c#include <stdio.h>int main() {int decimal, octal, remainder, place = 1;printf("请输入一个十进制数:");scanf("%d", &decimal);octal = 0;// 将十进制数转换成八进制数while (decimal != 0) {remainder = decimal % 8;octal += remainder * place;place *= 10;decimal /= 8;}printf("该数的八进制表示为:%d\n", octal);return 0;}```在这个代码中,我们首先声明了四个变量:decimal用于存储输入的十进制数,octal用于存储转换后的八进制数,remainder用于临时存储余数,place用于表示当前位数的权值。

接着,我们通过scanf语句从标准输入中读取一个整数,将其赋值给decimal。

然后,在一个while循环中,我们使用类似于上面的转换规律来将decimal转换成八进制数。

具体而言,我们不断地计算decimal除以8的余数,然后将其乘以对应的权值加入到octal中。

十进制转换 数据结构

十进制转换 数据结构

十进制转换数据结构
在数据结构中,十进制转换通常涉及到将十进制数字转换为其他进制的数字,包括二进制、八进制和十六进制。

将十进制数字转换为二进制:
可以使用除2取余法来将十进制数字转换为二进制。

具体步骤如下:
1. 从十进制数字的最右边开始,连续除以2,记录下每次的余数,并向左移动一位。

2. 当十进制数字除以2的商为0时,停止除法运算。

3. 将记录的余数从右往左排列,即为转换后的二进制数字。

将十进制数字转换为八进制:
可以使用除8取余法来将十进制数字转换为八进制。

具体步骤如下:
1. 从十进制数字的最右边开始,连续除以8,记录下每次的余数,并向左移动一位。

2. 当十进制数字除以8的商为0时,停止除法运算。

3. 将记录的余数从右往左排列,即为转换后的八进制数字。

将十进制数字转换为十六进制:
可以使用除16取余法来将十进制数字转换为十六进制。

具体步骤如下:
1. 从十进制数字的最右边开始,连续除以16,记录下每次的余数,并向左移动一位。

2. 当十进制数字除以16的商为0时,停止除法运算。

3. 将记录的余数从右往左排列,如果余数大于9,则用字母
A~F表示对应的十六进制数。

这些转换在计算机科学领域中经常用到,可以通过编程语言中的计算方法来实现。

栈的实现及进制转换

栈的实现及进制转换

业务1512 王俊钢实训报告(数据结构)课程项目:栈的实现及进制转换班级:1512姓名:王俊钢指导教师:张冰日期:2015年11月实验二栈和队列一、实验目的1、掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。

2、掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,队列顺序存储结构、链式存储结构和循环队列的实现,以便在实际问题背景下灵活应用。

二、实验内容1、顺序栈的实现和运算;2、栈的运用—十进制转八进制运算。

三、实验要求1、学生用C++/C完成算法设计和程序设计并上机调试通过;2、撰写实验报告,提供实验测试数据和实验结果;3、分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。

四、实验准备1、掌握栈和队列这两种抽象数据类型的特点,并能在相应的应用任务中正确选用它们;2、熟练掌握顺序栈和循环队列的基本操作实现算法,特别应注意栈满和栈空的条件以及它们的描述方法,循环队列中队满和队空的描述方法。

3、在学习顺序栈的基本操作实现算法时,应注意:在书上给出的结构定义是采用了一种动态管理方式(不够时,可以再分配),但在 C 语言中,用数组来存储顺序栈,是静态分配,即不能随机分配空间,这点易引起大家的误解。

五、实验步骤1、编程实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化顺序栈;(2)给定一个元素,将此元素压入此栈中;(3)将栈顶一个元素弹出此栈六、实验参考代码1、顺序栈的实现和运算;#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -2typedef int ElemType;typedef int Status;//----- 栈的顺序存储表示-----#define STACK_INIT_SIZE 100 // 存储空间的初始分配量#define STACKINCREMENT 10 // 存储空间的分配增量typedef struct {ElemType *base;ElemType *top;int stacksize;} SqStack;// 构造一个空栈SStatus InitStack(SqStack &S){S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if(!S.base) exit (OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;}// 判栈S 是否为空栈Status StackEmpty(SqStack S){if (S.top==S.base) return OK;else return ERROR;}//入栈函数Status Push (SqStack &S, ElemType e) {if (S.top - S.base>=S.stacksize){S.base = (ElemType * )realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(ElemType));if(!S.base) exit (OVERFLOW);//存储分配失败S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ =e;return OK;}//PushStatus Pop (SqStack &S, ElemType &e) {if (S.top == S.base) return ERROR;e = * -- S.top;return OK;}//输出顺序栈函数11void OutStack(SqStack S){ int *p;if(S.top == S.base){printf("这是一个空栈!");}elsefor(p= S.top-1; p>= S.base;p--)printf("%6d", *p);printf("\n");}//主函数void main(){ SqStack s;int cord; ElemType a;printf("第一次使用必须初始化!\n");do{printf("\n 主菜单\n");printf(" 1 初始化顺序栈");printf(" 2 插入一个元素");printf(" 3 删除栈顶元素");printf(" 4 结束程序运行");printf("\n------------------------------------------------------------------------------\n");printf("请输入您的选择( 1, 2, 3, 4)");scanf("%d",&cord);printf("\n");switch(cord){ case 1:InitStack(s);OutStack(s);break;case 2:printf("请输入要插入的数据元素:a=");scanf("%d",&a);Push(s,a);printf("%d 进栈之后的栈:",a);OutStack(s);break;case 3:Pop(s,a);printf("栈顶元素%d 出栈之后的栈:",a);OutStack(s);break;case 4:exit(0);}}while (cord<=4); }2、十进制转换八进制实验代码#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -2typedef int ElemType;typedef int Status;#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef struct {ElemType *base;ElemType *top;int stacksize;} SqStack;// 构造一个空栈SStatus InitStack(SqStack &S){S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if(!S.base) exit (OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;}// 判栈S 是否为空栈Status StackEmpty(SqStack S){if (S.top==S.base) return OK;else return ERROR;}//入栈函数Status Push (SqStack &S, ElemType e) {if (S.top - S.base >= S.stacksize){S.base = (ElemType *) realloc ( S.base,(S.stacksize + STACKINCREMENT) * sizeof (ElemType));if (!S.base) exit (OVERFLOW);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;}//十进制转八进制函数void conversion(){ SqStack S;int n,e;InitStack(S);printf("\n请输入N ");scanf("%d",&n);while (n){Push(S,n % 8);n=n/8;}while(!StackEmpty(S)){Pop(S,e);printf("%d",e);}}//conversionvoid main(){conversion(); }。

将十进制数转换为二进制和八进制

将十进制数转换为二进制和八进制

作业三问题描述:将十进制数转换为二进制和八进制解决思路:定义一个栈,再将十进制数逐次除以基数r(8或10)取余法,在转换过程中,由低到高依次得到r进制数中的每一位数字,存入栈中,再依次出栈即得所要的r进制数。

问题:无运行结果:源代码:program zhh(input,output);type link=^node;node=recorddata:integer;next:linkend;var y:integer;procedure binary(var x:integer);var p,q:link;y,z:integer;beginy:=x mod 2;new(q);q^.data:=y;p:=q;z:=x div 2;while z<>0 dobeginy:=z mod 2;new(q);q^.data:=y;q^.next:=p;p:=q;z:=z div 2;end;while p<>nil dobeginwrite(p^.data);p:=p^.next;end;end;procedure octal(var x:integer);var p,q:link;y,z:integer;beginy:=x mod 8;new(q);q^.data:=y;p:=q;z:=x div 8;while z<>0 dobeginy:=z mod 8;new(q);q^.data:=y;q^.next:=p;p:=q;z:=z div 8;end;while p<>nil dobeginwrite(p^.data);p:=p^.next;end;end;beginwrite('please input x:'); readln(y);write('binary:'); binary(y);writeln();write(' octal:');octal(y);writeln();end.。

数据结构实验2数制转换

实验二、数制转换一、实验目的1.掌握堆栈的存储方式和基本操作。

2.掌握堆栈后进先出运算原则在解决实际问题中的应用。

3.掌握使用栈的原理来解决数制转换问题。

二、实验内容利用栈结构,编写程序将十进制数转换成二进制数或八进制数。

提示:十进制数值转换成二进制使用辗转相除法将一个十进制数值转换成二进制数值。

即用该十进制数值除以2,并保留其余数;重复此操作,直到该十进制数值为0为止。

最后将所有的余数反向输出就是所对应的二进制数值。

十进制数值转换成八进制算法类似。

转换算法要求用一个函数完成。

顺序栈的基本操作的代码可参考如下:typedef struct{DataType stack[MaxStackSize];int top;} SeqStack;void StackInitiate(SeqStack *S) /*初始化顺序堆栈S*/{ S->top = 0; /*定义初始栈顶下标值*/}int StackNotEmpty(SeqStack S)/*判顺序堆栈S非空否,非空则返回1,否则返回0*/{ if(S.top <= 0) return 0;else return 1;}int StackPush(SeqStack *S, DataType x)/*把数据元素值x压入顺序堆栈S,入栈成功则返回1,否则返回0 */{ if(S->top >= MaxStackSize){ printf("堆栈已满无法插入! \n");return 0;}else{ S->stack[S->top] = x;S->top ++;return 1;}}int StackPop(SeqStack *S, DataType *d)/*弹出顺序堆栈S的栈顶数据元素值到参数d ,出栈成功则返回1,否则返回0*/ { if(S->top <= 0)printf("堆栈已空无数据元素出栈! \n");return 0;}else{S->top --;*d = S->stack[S->top];return 1;}}int StackTop(SeqStack S, DataType *d)/*取顺序堆栈S的当前栈顶数据元素值到参数d ,成功则返回1,否则返回0*/ {if(S.top <= 0){ printf("堆栈已空! \n");return 0;}else{ *d = S.stack[S.top - 1];return 1;}}三、实验源代码#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef int DataType;typedef struct node{DataType data[MAXSIZE];int top;}SeqStack,*PSeqStack;typedef structDataType data[MAXSIZE];int front,rear;}SeqQueue,*PSeqQueue;PSeqStack Init1(void){PSeqStack S;S=(PSeqStack)malloc(sizeof(SeqStack));if(S) S->top=-1;return S;}PSeqQueue Inin2(){PSeqQueue Q;Q=(PSeqQueue)malloc(sizeof(SeqQueue));if(Q){Q->front=0;Q->rear=0;}return Q;}int Empty1(PSeqStack S)if(S->top==-1)return(1);elsereturn 0;}int Empty2(PSeqQueue Q){if(Q && Q->front==Q->rear)return 1;elsereturn 0;}int Push(PSeqStack S,DataType x) {if(S->top==MAXSIZE-1)return 0;else{S->top++;S->data[S->top]=x;return 1;}int In(PSeqQueue Q, DataType x){if((Q->rear+1)%MAXSIZE==Q->front ) {printf("队满");return -1;}else{Q->rear=(Q->rear+1)%MAXSIZE;Q->data[Q->rear]=x;return 1;}}int Pop(PSeqStack S,DataType *x){if(Empty1(S))return 0;*x=S->data[S->top];printf("%d",*x);S->top--;return 1;int Out(PSeqQueue Q){if(Empty2(Q)){printf("队空");return -1;}else{Q->front=(Q->front+1)%MAXSIZE;printf("%d",Q->data[Q->front]);}return 0;}void transfrom1(PSeqStack S,int x,int t) {while(x!=0){Push(S,x%t);x=x/t;}while(S->top!=-1)Pop(S,&S->data[S->top]);}void transfrom2(PSeqQueue Q,float x,int t) {while(x!=0){x=x*t;In(Q,(int)x);x=x-(int)x;}while(!Empty2(Q))Out(Q);}int main(){PSeqStack S;PSeqQueue Q;int t;float x;S=Init1();Q=Inin2();printf("请输入要转换的数:");scanf("%f",&x);printf("请输入要转化成几进制:");scanf("%d",&t);printf("%f 转化成%d 进制为:",x,t);transfrom1(S,(int)x,t);if(x==(int)x){printf("\n");return 0;}printf(".");transfrom2(Q,x-(int)x,t);printf("\n");return 0;}四、实验结果。

十进制转换为八进制

本程序是一个用C语言编写的十进制转八进制的转换器。它首先定义了一个栈结构,并实现了栈的初始化、判空、入栈和出栈操作。在main函数中,程序先初始化栈,然后提示用户输入一个想要转换的十进制数。接着,程序通过循环将输入的十进制数不断除以8,并将余数入栈,直到商为0。最后,程序通过出栈操作将栈中的余数依次取出并打印,从而得到对应的八进制数。但需要注意的是,虽然用户搜索的是8进制转十进制,本程序实现的是相反பைடு நூலகம்转换,即从十进制转换到八进制。如果用户需要8进制转十进制的方法,那实际上是一个更简单的操作:只需将8进制数的每一位乘以对应的8的幂次,然后求和即可。

(数据结构)数制转换,十进制转为八进制

int *base;
int *top;
int stacksize;
}SqStack;
typedef int Status;
Status InitStack(SqStack &S){
S.base=(int *)malloc(Stack_Init_Size* sizeof(int));
if(!S.base)
cin>>N;
while(N)
{
Push(s,N%8);
N=N/8;
}
cout<<"其化为八进制数为:";
while(!StackEmpty(s))
{
Pop(s,l);
cout<<l;
}
cout<<"\n";
system("pause");
return 0;
}//main
exit(overflow);
S.top=S.base;
S.stacksize=Stack_Init_Size;
return OK;
}
Status Push(SqStack &S,int e){
if(S.top-S.base>=S.stacksize){
S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
数据结构数制转换十进制转为八进制数据结构为八进制十进制八进制数制转换十进制转换数制转换数制转换数据结构
//十进制转换为八进制.cpp : Defines the entry point for the console application.

进制转换与栈

进制转换与栈一、引言进制转换是计算机科学中的重要概念,而栈是一种常用的数据结构。

本文将介绍进制转换的基本原理以及利用栈实现进制转换的方法。

二、进制转换的基本原理进制是表示数字的一种方式,常见的进制有十进制、二进制、八进制和十六进制。

不同进制之间可以相互转换,转换的原理是利用权重和除法运算。

1. 十进制转换为其他进制将十进制数除以进制数,得到的商再次除以进制数,直到商为0。

将每次的余数从下往上排列,即可得到转换后的结果。

2. 其他进制转换为十进制将其他进制的每一位数乘以对应的权重,然后将结果相加,即可得到转换后的十进制数。

三、栈的概念与特点栈是一种特殊的线性数据结构,它具有后进先出(LIFO)的特点。

栈有两个基本操作:入栈(push)和出栈(pop)。

1. 入栈:将数据元素放到栈的顶部。

2. 出栈:从栈的顶部移除数据元素。

栈的应用十分广泛,包括括号匹配、函数调用的存储、表达式求值等。

四、利用栈实现进制转换栈可以很好地辅助进制转换的过程。

以将十进制数转换为二进制数为例,具体步骤如下:1. 将十进制数除以2,得到的余数入栈。

2. 再将商除以2,得到的余数入栈,以此类推,直到商为0。

3. 将栈中的元素依次出栈,即可得到转换后的二进制数。

以将十进制数28转换为二进制数为例,具体步骤如下:1. 第一次除以2,商为14,余数为0,入栈。

2. 第二次除以2,商为7,余数为1,入栈。

3. 第三次除以2,商为3,余数为1,入栈。

4. 第四次除以2,商为1,余数为1,入栈。

5. 第五次除以2,商为0,余数为1,入栈。

依次出栈得到的结果为11100,即28的二进制表示为11100。

五、其他进制的转换利用栈,我们还可以实现其他进制的转换,只需要将除法运算中的2替换成对应的进制数即可。

六、总结本文介绍了进制转换的基本原理以及利用栈实现进制转换的方法。

进制转换是计算机科学中常见的操作,掌握了进制转换的原理和方法,可以更好地理解计算机内部的数据表示方式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档