当前位置:文档之家› 栈的实现及进制转换

栈的实现及进制转换

栈的实现及进制转换
栈的实现及进制转换

业务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

#include

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int ElemType;

typedef int Status;

//----- 栈的顺序存储表示-----

#define STACK_INIT_SIZE 100 // 存储空间的初始分配量

#define STACKINCREMENT 10 // 存储空间的分配增量

typedef struct {

ElemType *base;

ElemType *top;

int stacksize;

} SqStack;

// 构造一个空栈S

Status 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;

}//Push

Status Pop (SqStack &S, ElemType &e) {

if (S.top == S.base) return ERROR;

e = * -- S.top;

return OK;

}

//输出顺序栈函数11

void OutStack(SqStack S)

{ int *p;

if(S.top == S.base){

printf("这是一个空栈!");

}

else

for(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

#include

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int ElemType;

typedef int Status;

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

typedef struct {

ElemType *base;

ElemType *top;

int stacksize;

} SqStack;

// 构造一个空栈S

Status 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);

}

}//conversion

void main()

{

conversion(); }

栈的顺序表示和实现

(1)开始界面(2)初始化线性表 3.插入:下面是插入第一个元素的图(3),插入后再一次插入其他元素,最终插完元素,见图(4)

(4)插入最后一个元素(第五个) 5.取栈顶元素,如图( (5)删除栈顶元素(6)取栈顶元素 6.置空顺序栈,如图(7) (7)置空顺序表 7. 数值转换(将一个十进制数转换为任意进制) 三进制数2220。

(9)回文数判断a (10)回文数判断b 实验结论:实验成功 八.我对本次实验的总结: 1.通过对该程序的调试和运行,使的对顺序栈的功能及其构成有了进一步的了解。 2.通过多个函数出现在同一个程序中的实现,便于熟悉全局变量和局部变量在程序中 可以重新熟悉函数在编程中的设置方法

void InitStack(SqStack *p) {if(!p) printf("内存分配失败!"); p->top =-1; } /*入栈*/ void Push(SqStack *p,ElemType x) {if(p->top top =p->top+1; p->stack[p->top]=x; } else printf("Overflow! \n"); } /*出栈*/ ElemType Pop(SqStack *p) {ElemType x; if(p->top>=0) { x=p->stack[p->top]; printf("以前的栈顶数据元素%d已经被删除!\n",p->stack[p->top]); p->top=p->top-1; return(x); } else {printf("Underflow! \n"); return(0); } } /*获取栈顶元素*/ ElemType GetTop(SqStack *p) { ElemType x; if(p->top>=0) { x=p->stack[p->top]; printf("\n栈顶元素为:%d\n",x); return(x); } else { printf("Underflow! \n"); return(0); } } /*遍历顺序表*/ void OutStack(SqStack *p) { int i;

数据结构课程设计 数制转换 数组和栈

中北大学 数据结构与算法课程设计 说明书 学院、系:软件学院 专业:软件工程 学生姓名:xxx 学号:xxxx 设计题目:数制转换问题 起迄日期: 2013年12月9日- 2013年12月20日指导教师:xxx 2013 年12月 20 日

1、需求分析 任意给定一个M进制的数x ,请实现如下要求 1) 求出此数x的10进制值(用MD表示) 2) 实现对x向任意的一个非M进制的数的转换。 3) 用两种方法实现上述要求(用栈解决和用数组解决)。 2、概要设计 流程图 数组的流程图:

栈的流程图:

算法思想 1、用数组实现该问题: DtoM()函数和MtoD()函数是实现该问题的主要函数。DtoM()函数是实现十进制转换为其它进制的函数,它是将输入的十进制数x取首先对需要转换的进制M取余,然后再对其取整,接着通过递归调用DtoM()函数依次将得到的整数部分依次先取余后取整,并将所得的余数依次存入一个数组中,然后逆向取出数组中的元素,即得到转换后的结果。而MtoD()函数则是实现其他进制M转换为十进制,并将其转换为非M进制的数。M进制转十进制则是从该M进制数的最后一位开始算,依次列为第0、1、2…n位并分别乘以M的0、1、2…n次方,将得到的次方相加便得到对应的十进制数,再调用DtoM()函数将其转换为非M进制的数。 2、用栈实现该问题: 同样是利用DtoM()和MtoD()两个函数实现。两个函数的思想同利用数组实现时相同。只是栈具有后进先出的性质,故其用Pop()取数较数组的逆向取数方便些。 模块划分 1、用数组实现该问题: ⑴i,j,y,n,s,m,r,reminder,x是定义的全局变量,初始值都为0; ⑵DtoM(int g,int h)是实现十进制数转换为M进制数的函数; ⑶MtoD()是实现M(仅指二进制数和八进制数)进制数转换为十进制数的函数,并 在其中调用D2M(int g,int h)实现向非M进制数的转换; ⑷HtoD(int f)是实现十六进制数转换为十进制数的函数,并在其中调用D2M(int g,int h)实现向非十六进制数的转换; ⑸void main()是主函数,功能是给出测试的数据,并在特定条件下调用D2M()

栈的课程设计完整版

唐山学院 数据结构课程设计 题目栈的基本操作及其应用 系 (部) 计算机科学与技术系 班级 16计本(2) 姓名周登旺 学号 4164001232 指导教师郭琳虹 2018 年 1 月8日至2018 年1 月12日共1 周

数据结构课程设计任务书

课程设计成绩评定表

1.引言 在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。首先系统或者数据结构栈中数据内容的读取与插入(压入push和弹出pop)是两回事!插入是增加数据,弹出是删除数据,这些操作只能从栈顶即最低地址作为约束的接口界面入手操作,但读取栈中的数据是随便的没有接口约束之说。很多人都误解这个理念从而对栈产生困惑。而系统栈在计算机体系结构中又起到一个跨部件交互的媒介区域的作用即cpu与内存的交流通道,cpu只从系统给我们自己编写的应用程序所规定的栈入口线性地读取执行指令,用一个形象的词来形容它就是pipeline(管道线、流水线)。cpu内部交互具体参见EU与BIU的概念介绍。栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。栈可以用来在函数调用的时候存储断点,做递归时要用到栈! 一、基本概念 栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表。 栈是一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表(LIFO表),栈可以用来在函数调用的时候存储断点,做递归时要用到栈! 本课程设计涉及的主要内容是对栈进行基本操作和实现栈的一些实际应用,在课程设计中,系统开发平台为Windows 7。程序设计语言使用Visual c++。程序的运行平台为Windows 2000/XP/7/10。 /* 2问题分析 本次课程设计主要介绍栈的概念和栈的基本操作和栈的两种存储结构及其应用。其中栈的基本操作主要包括置空栈,判断栈空,进栈,出栈,取栈顶元素。栈的两种存储

用栈实现把十进制转化为八进制

#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(-1); s.top=s.base; s.stacksize=STACK_INIT_SIZE; return 1; } int Pop(sqstack &s,int &e) { if(s.top==s.base) return 0; e=*--s.top; return 1; } 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 1; } int StackEmpty(sqstack s) { if(s.top==s.base) return 0; else return 1; }

栈的应用:数制转换

数制转换: 十进制数N和其它d进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一种简单方法基于以下原理. N=(N div d)*d+N mod d (其中:div为整除运算,mod 为求余运算.) 例如:10进制数1348转换为8进制为:2504.其运算过程如下: N N div d N mod d 1348 168 4 168 21 0 21 2 5 2 0 2 假设现要编制一个满足下列要求的程序:对于输入的任意一个非负十进制整数,打印输出与其相等的八进制数,由于上述计算过程是从低位到高位顺序产生八进制数的各个位数,而打印输出,一般来说应从高位到低位进行,恰好和计算过程相反.因此,若将计算过程中得到的八进制数的各位顺序进栈,则按出栈序列打印输出的即为与输入对应的八进制数. 算法描述如下: void conversion() { InitStack(s); scanf(" %d",N); while(N) { push(s,n%8) N=N/8; } while(!StackEmpty(s)) { Pop(S,e); printf("%d",e); } } 这个是利用栈的先进后出特性的最简单的例子.在这个例子中,栈操作的序列是直线式的,即先一味地进栈,然后一味的出栈.也许有人会提出疑问:用数组直接实现不也很简单吗?仔细分析上述算法不难看出,栈的引入简化了程序设计的问题,划分了不同的关注层次,使思考的范围缩小了.而用数组不仅掩盖了问题的本质,还要分散精力去考虑数组下标增减等细节. 完整代码实现: #include<iostream> #include<stack> using namespace std; void change(int n,int d)

数据结构实验报告 栈进制转换

数据结构试验报告栈的应用——进制转换程序

3.出栈程序 int Pop(Stack *s , int *e) { if(s->top == s->base) { return ERROR; } *e = * -- s->top; return OK; } 4.主函数与进制转化 void main() { int N; int a; int e; Stack s; InitStack(&s); Pop(&s , &e); Push(&s ,&e); InitStack(&s); printf("请输入十进制数:"); scanf("%d",&N); printf("要将N转化为几进制?"); scanf("%d",&a); while(N) { e=N%a; Push( &s , &e ); N = N / a ; } while(s.base!=s.top) { Pop(&s ,&e); printf("%d",e); } free(s.base); system("pause"); } 3.源程序 #include #include #include

#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define TRUE 1 #define FALSE -1 typedefstruct{ int *base; int *top; intstacksize; }Stack; intInitStack(Stack *s) { s->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int)); if(!s->base) { exit(OVERFLOW); } s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } int Push(Stack *s , int *e) { if(s->top - s->base >= STACK_INIT_SIZE) { s->base=(int *)realloc(s->base , (s->stacksize + STACKINCREMENT) * sizeof(int) ); if(!s->base) { exit(OVERFLOW); } s->top=s->base + STACKINCREMENT; } * s->top ++ = *e; return OK; } int Pop(Stack *s , int *e)

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

实验目的 建立栈实现十进制转八进制 实验内容 编程序并上机调试运行。 建立栈实现十进制转八进制 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); }

利用栈实现数制转换(10进制转换8进制)

//利用栈实现数制转换(10进制转换8进制) #include #include #define ERROR 0 #define OK 1 #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 typedef int SElemType; typedef struct stack { SElemType *top; SElemType *bottom; int stacksize; }SqStack; int InitStack(SqStack *S) { //构造一个空栈 S->bottom=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S->bottom) return ERROR; //存储分配失败 S->top=S->bottom; S->stacksize=STACK_INIT_SIZE; return OK; } //InitStack int Push(SqStack *S,SElemType e) { //插入元素e为新的栈顶元素 if(S->top-S->bottom>=S->stacksize-1) { S->bottom=(SElemType*)realloc(S->bottom, (S->stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S->bottom) return ERROR; // S->top=S->bottom+S->stacksize; } *S->top++=e;

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

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

实验目的 建立栈实现十进制转八进制 实验内容 编程序并上机调试运行。 建立栈实现十进制转八进制 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);

C语言 用栈实现进制转换

C语言用栈实现进制转换 #include #include #include #include #define S_SIZE 100 //栈所占空间的大小 #define STACKINCREAMENT 10 //扩充空间时一次扩充十个字节struct SqStack { int *base; //栈底 int *top; //栈顶 int stacksize;//栈当前的存储空间 }*S; //主函数开始 void main() { //子函数声明 void InitStack(S);//初始化空栈 int StackEmpty(SqStack S);//判栈空 void GetTop(SqStack S,int &e);//获得栈顶元素 void push(SqStack &S,int e);//进栈 void pop(SqStack &S,int &e);//出栈 void convert(SqStack &5,int N,int n);//十进制转N进制 int i,num; unsigned n,N;//要转换的进制数及要转换的数 SqStack s; InitStack(s);//初始化空栈 printf("输入要转换的十进制数和要转换为的进制数:\n"); scanf("%d,%d",&N,&n); printf("%d转换为%d进制后为:\n",N,n); convert(s,N,n); } void InitStack(SqStack &S) { S.base = (int *)malloc(S_SIZE*sizeof(int)); S.stacksize=S_Size; S.top=S.base;//初始化空栈 } int StackEmpty(SqStack S) {

用栈实现把十进制转化为八进制

用栈实现把十进制转化 为八进制 文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]

#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(-1); s.top=s.base; s.stacksize=STACK_INIT_SIZE; return 1; } int Pop(sqstack &s,int &e) { if(s.top==s.base) return 0;

e=*--s.top; return 1; } 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 1; } int StackEmpty(sqstack s) { if(s.top==s.base) return 0; else return 1;

数制转换(栈的应用)

实验二栈的应用(数制转换) 一、实验目的 掌握栈的基本操作: 初始化栈、判栈为空、出栈、入栈等运算。 二、实验要求 1.认真阅读和掌握本实验的算法。 2.上机将本算法实现。 3.保存程序的运行结果,并结合程序进行分析。 三、实验内容 利用栈的基本操作实现将任意一个十进制整数转化为R进制整数。算法为: 1、定义栈的顺序存取结构 2、分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等) 3、定义一个函数用来实现上面问题: (1)十进制整数X和R作为形参 (2)初始化栈 (3)只要X不为0重复做下列动作 将X % R入栈, X=X/R (4)只要栈不为空重复做下列动作 栈顶出栈,输出栈顶元素 四、实验报告要求:

1、十进制整数转化为R进制整数算法的代码; 2、程序运行结果及分析; 3、实验总结。 具体实现: /* 栈(综合)时间------2012 3 16 */ # include # include # include typedef struct node {int data; struct node *next; }NODE , *PNODE; typedef struct stack {PNODE top; //!!!!节点指针类型,用于保存当前栈顶节点的地址(top 和bottom 均为栈所需成员) PNODE bottom; //!!!节点指针类型,用于保存栈内最后一个节点的下一个无实际含义节点的地址,操作中,此指针无需变更 }STACK , *PSTACK; void push_stack(PSTACK ps,int val); void init_stack(PSTACK ps); void travel_stack(PSTACK ps); bool is_empty(PSTACK ps);

数据结构课程设计报告-进制转换

课程设计报告 设计题目:进制转换问题 学生姓名: 专业:信息安全 班级:信息安全10-02 学号: 指导教师: 完成日期:2011年12月 课程设计报告的内容及要求 一、问题描述: 任意给定一个M进制的数x ,请实现如下要求: 1、求出此数x的10进制值(用MD表示) 2、实现对x向任意的一个非M进制的数的转换 3、至少用两种或两种以上的方法实现上述要求(用栈解决,用数组解决,其它方法解决)软件环境:Vc6.0编程软件 二、实验环境 运行平台:Win32 硬件:普通个人pc机 软件环境:VC++6.0编程软件 三、解决办法: 1、用数组实现该问题: ten_else()函数是实现十进制转换为其它进制的函数,先设置一个while循环,当十进制数g等于零时停止,再将输入的十进制数x取首先对需要转换的进制M取余,然后再对其取整,并将所得的余数依次存入一个数组中,然后逆向取出数组中的元素,即得到转换后的结果。将其他进制M转换为十进制,并将其转换为非M进制数是在主函数中实现的。M进制转十进制则是从该M进制数的最后一位开始算,依次列为第0、1、2…n位并分别乘以M 的0、1、2…n次方,将得到的次方相加便得到对应的十进制数,再调用ten_else()函数将其转换为非M进制的数。实际上十进制起到了一个桥梁作用。 2、用栈实现该问题: 与数组方法核心思想相同,stack定义栈,初始化一个空栈,然后判断是否为空,接着是去栈顶元素(用z表示栈顶元素),数据入栈,出栈的操作。栈具有后进先出的性质,故其用s.pop()取数较数组的逆向取数较为方便,体现了栈的优越性。

四、设计和编码的回顾讨论和分析 (1)函数ten_else()的作用体现在将任意10进制数转换为非10进制数,程序能实现1~16进制的相互转换。在10进制以上的数需要用字母表示,由此设计了switch函数,当出现余数大与10的情况可以调用相应的字母。考虑到最终结果是所求余数的倒序,添加新的整型变量j,通过一个for循环实现倒序。 (2)编程初期设计了else_ten函数,后几经修改将其融入main函数中较为直观。 (3)当输入10进制以下的数向10进制转换时候较为简单,程序中设计char型数组s[maxnum]来统计所输入数据的位数,不需要用户输入。在求10进制的时候通过for循环求一个累和即可。 (4)当输入10进制以上的数设计字母较为复杂,通过对ASCⅡ表的理解设计程序。 (5)在用栈法实现非10进制向10进制转换的时候遇到了些麻烦,当输入8A的时候程序将8当成字符类型,将其编译为数字56,导致最终转换结果出现错误。于是通过查阅ASCⅡ表对程序做出了修正,设计了条件语句if(z<=57)z-=48;if(z>=65){z-=65;z+=10;} 五、程序框图 六、经验和体会 (1)我们在写程序的时候要多角度考虑问题,比如题目中要求栈法与数组方法同时去实现进制转换问题。在编译过程中我们可以将特殊的问题逐渐的化为一般问题,比如10进制转换到16进制是,我举的例子是200转换为C8。 (2)通过此次课程设计的考验,让我们回顾了算法与数据结构这门课的主要内容。掌握了如何分别用数组和栈来实现数据存储与转换,加深了对栈的掌握和操作,以及栈先进后出的特点。 (3)在程序的调试初期,我们遇到了许多问题,暴露了对编译软件不熟悉的弊端,如设置断

数据结构课程设计--进制转换的实现

数据结构课程设计 设计说明书 进制转换的实现 学生姓名 学号 班级 成绩 指导教师

课程设计任务书 天灾元年—近卫戊年第二学期 课程设计名称:数据结构课程设计 设计题目:进制转换的实现 设计依据、要求及主要内容(可另加附页): 进制数制是人们利用符号进行计数的科学方法。数制有很多种,在计算机中常用的数制有:十进制,二进制、八进制和十六进制。十六进制数有两个基本特点:它由十六个字符0~9以及A,B,C,D,E,F组成(它们分别表示十进制数0~15),十六进制数运算规律是逢十六进一,例如:十六进制数4AC8可写成(4AC8)16,或写成4AC8H。 要求: (1)输入一个十进制数N,将它转换成R进制数输出,并可以进行逆转换。 (2)输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。 (3)为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。 (4)界面友好。 指导教师(签字):教研室主任(签字): 批准日期:年月日

摘要 由于数制计算和不同数制之间转换的需要,设计了一个10进制转换其它进制(36进制以内)及逆转换的软件,该软件具有简单的将10进制数转换成2、8、16进制数以及较复杂的高进制数的转换和逆转功能。本软件采用C语言编写以VC++作为软件开发环境,采用顺序栈存储方式来存储运算中的数位,借助栈后进先出的特点,易于结果输出。操作简单,界面清晰,易于为用户所接受。 关键词:进制转换;顺序栈;逆转换

目录 1 课题描述 (1) 2 问题分析和任务定义 (2) 4 详细设计 (7) 5 程序编码 (8) 6 程序调试与测试 (13) 7 结果分析 (15) 8 总结 (16) 参考文献 (17)

顺序栈的应用(十进制转换为八进制,通过VC++调试运行)

// 十进制转换为八进制.cpp : Defines the entry point for the console application. #include"iostream" #include"stdlib.h" #include"stdio.h" using namespace std; #define Stack_Init_Size 100 #define STACKINCREMENT 10 #define overflow -2 #define ERROR 0 #define OK 1 typedef struct{ 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) 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)); if(!S.base)exit(overflow); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; return OK; } Status Pop(SqStack &S,int &e){ if(S.top==S.base)return ERROR; e=*--S.top; return OK; } bool StackEmpty(SqStack S) { if(S.base==S.top) return 1; else

数据结构利用栈数制转换程序

数据结构利用栈数制转换程序 主程序 #include"stdio.h" #include"string.h" #include"stdlib.h" #include" StackOperation.h " #include"function.h" #include "Stack.h" void main() { int a,N; char ch; SqStack *S=new SqStack[]; printf("若进行数制转换请选择:\n"); ch=getchar(); InitStack(S);//构造空栈S printf("输入需要转换的整数:"); scanf("%d",&a); printf("输入所需转换的进制数:"); scanf("%d",&N); conversion(S,a,N); } 头文件 StackOperation.h #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 #define OK 1 #define ERROR 0 #define TURE 1 #define FALSE 0 #define OVERFLOW 0 #define INFEASIBLE 0 typedef int Status; typedef char SElemType; typedef struct{ SElemType *base;//在栈构造之前和销毁之后,base的值为NULL SElemType *top;//栈顶指针

int stacksize;//当前已分配的存储空间,以元素为单位 }SqStack; function.h Status InitStack(SqStack *S);//构造一个空栈S Status DestroyStack(SqStack *S);//销毁S,S不再存在 Status ClearStack(SqStack *S);//把S置为空栈 Status StackEmpty(SqStack *S);//若栈S为空栈,则返回TURE,否则返回FALSE int StackLength(SqStack *S);//返回S的元素个数,即栈的长度 Status GetTop(SqStack *S,SElemType *e);//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR Status Push(SqStack *S,SElemType e);//插入元素e为新的栈顶元素 Status Pop(SqStack *S,SElemType *e);//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR //Status StackTraverse(SqStack *S,Status(*visit)());//从栈顶到栈底依次对栈中每一个元素调用函数visit()失败,则操作失败 void conversion(SqStack *S,int a,int N);//对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 void LineEdit(SqStack *S);//利用字符栈S,从终端接收一行并传送至调用过称的数据区. Status Check(SqStack *S);//检验某行[]或()是否匹配 Stack.h Status InitStack(SqStack *S)//构造一个空栈S { S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S->base) exit(OVERFLOW);//存储分配失败 S->top=S->base; S->stacksize=STACK_INIT_SIZE; return OK; }//InitStack Status DestroyStack(SqStack *S)//销毁S,S不再存在 { free(S->base); S->top=NULL; S->base=NULL; S->stacksize=0; return OK; } Status ClearStack(SqStack *S)//把S置为空栈 { S->top=S->base; return OK; } Status StackEmpty(SqStack *S)//若栈S为空栈,则返回TURE,否则返回FALSE

C语言实现十进制转换为任意进制(栈)

实验报告 课程名称:数据结构 年级班级:计算机1712 学号姓名:查玉坤 2017116128 任课教师:康长青

实验目的 设计算法,把十进制整数转换为二至九进制之间的任一进制输出。 实验内容 代码如下: #include #include #define INITSIZE 100 typedef int ElemType; typedef struct { int top; ElemType *base; int stacksize; }sqstack; /*初始化操作(创建一个空栈S)*/ void initstack(sqstack *S) { S->base=(ElemType *)malloc(INITSIZE*sizeof(ElemType)); S->top=0; S->stacksize=INITSIZE; } /*入栈操作(将值为x的数据元素插入到栈S中,使之成为栈顶元素)*/ int push(sqstack *S,ElemType x) { if(S->top>=S->stacksize) {S->base=(ElemType*)realloc(S->base,(S->stacksize+1)*sizeof(ElemType)); if(!S->base) return 0; S->stacksize++; } S->base[S->top++]=x; return 1; } /*输出栈操作(输出自栈顶到栈底的元素值)*/ void list(sqstack *S) { int i;

for(i=S->top-1;i>=0;i--) printf("%d",S->base[i]); printf("\n"); } int main(){ int a,b,Jin,x,X,size; a=1; printf("输入一个十进制数\n"); scanf("%d",&x); X=x; printf("需要转化为多少进制数?\n"); scanf("%d",&Jin); sqstack S; initstack(&S); while(x>=Jin){ a=(x%Jin); b=(x/Jin); push(&S,a); x=b; } push(&S,x); printf("转换的%d进制数为:",Jin); list(&S); printf("验证:\n"); for(int i=S.top;i>0;i--){ if(i-1!=0) printf("%d*(%d^%d)+",S.base[i-1],Jin,i-1); else printf("%d*(%d^0)=%d\n",S.base[i-1],Jin,X); } return 0; }

数据结构中利用栈将10进制转换为2、8、16进制

#include typedefstruct tagSTACK { int stack[255]; int top; }STACK; STACK s; void push(int i) { s.top++; s.stack[s.top] = i; } int pop() { int ret; if (s.top> -1) { ret = s.stack[s.top]; s.top--; return ret; } return -1; } void Bin(int i, int k, char str[]) { int j, ret; while (i) { push(i % k); i /= k; } for (j = 0; ret = pop(), ret != -1; ++j) { if (ret > 9) { str[j] = ret + 'A' - 10; } else {

str[j] = ret + '0'; } } str[j] = 0; } int main(void) { int i; int j; char result[255]; s.top = -1; printf("Please inuput the Number:"); scanf("%d", &i); getchar(); printf("Please inuput the mode (2,8,16):"); scanf("%d", &j); getchar(); switch (j) { case 2: Bin(i, 2, result); printf("二进制:\t\t%s\n", result); s.top = -1; break; case 8: s.top = -1; Bin(i, 8, result); printf("八进制:\t\t%s\n", result); break; case 16: s.top = -1; Bin(i, 16, result); printf("十六进制:\t%s\n", result); break; } return 0; }

相关主题
文本预览
相关文档 最新文档