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

合集下载

数据结构实验指导书(C++)-栈、队列、串的操作

数据结构实验指导书(C++)-栈、队列、串的操作

数据结构实验指导书(C++)-栈、队列、串的操作实验二栈、队列、串的操作实验类型:验证性实验要求:必修实验学时: 2学时一、实验目的:参照给定的栈类和队列类的程序样例,验证给出的栈和队列的常见算法,并结合线性表类实现有关串的操作。

二、实验要求:1、掌握栈、队列、串的特点。

掌握特殊线性表的常见算法。

2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。

三、实验内容:1. 堆栈类测试和应用问题。

要求:(1)设计一个主函数实现对顺序堆栈类和链式堆栈类代码进行测试。

测试方法为:依次把数据元素1,2,3,4,5入栈,然后出栈堆栈中的数据元素并在屏幕上显示。

(2)定义数据元素的数据类型为如下形式的结构体:typedef struct{ char taskname[10];//任务名int taskno; //任务号}DataType;设计一个包含5个数据元素的测试数据,并设计一个主函数实现依次把5个数据元素入栈,然后出栈堆栈中的数据元素并在屏幕上显示。

2. 队列类测试和应用问题。

要求:设计一个主函数对循环队列类和链式队列类代码进行测试.测试方法为:依次把数据元素1,2,3,4,5入队,然后出队中的数据元素并在屏幕上显示。

3.设计串采用顺序存储结构,编写函数实现两个串的比较Compare(S, T)。

要求比较结果有大于、等于和小于三种情况。

*4. 设计算法利用栈类实现把十进制整数转换为二至九进制之间的任一进制输出。

*5. 设计串采用静态数组存储结构,编写函数实现串的替换Replace(S, start, T, V),即要求在主串S中,从位置start开始查找是否存在子串T,若主串S中存在子串T,则用子串V替换子串T,且函数返回1;若主串S中不存在子串T,则函数返回0。

并要求设计主函数进行测试。

一个测试例子为:S=”I am a student”,T=”student”,V=”teacher “。

栈的应用-数制转换(C语言数据结构)

栈的应用-数制转换(C语言数据结构)

栈的应⽤-数制转换(C语⾔数据结构)数制转换在计算机中经常⾯对不同数制的转换问题,如将⼀个⼗进制数N转换为d进制B。

数制转换的解决⽅法很多,其中⼀个简单的转换算法是重复下述两步。

直到N等于零为⽌。

x = N mod dN = N div d其中,N为需要转换的⼗进制数,d为转换后的进制,x值为转换后各个数位上的数,div为整除运算,mod为求余运算。

算法的运⾏过程为:第⼀次求出的x值为d进制数的最低位,最后⼀次求出的x值为d进制数的最⾼位,所以上述算法是从低位到⾼位顺序产⽣d进制的各位,然后逆序输出,因为它按“后进先出”的规律进⾏的,所以⽤栈这种结构处理最合适。

根据这个特点,利⽤栈来实现上述数制转换,即将计算过程种⼀次得到的d进制数码按顺序栈进栈。

计算结束后,再返顺序出栈,并按出栈顺序打印输出。

这样即可得到给定的⼗进制数对应的d进制数,由此可以得到数制转换的算法。

实现代码利⽤顺序栈实现数制转换(以⼗进制转换为⼆进制为例)1 #include <stdlib.h>2 #include <stdio.h>3 #define MAXSIZE 102445 /*定义顺序栈*/6 typedef int elemtype;7 typedef struct SequenStack8 {9 elemtype data[MAXSIZE];10 int top;11 }SequenStack;1213 /*判(顺序栈)栈空*/14 SequenStack * Init_SequenStack()15 {16 SequenStack * S;17 S = (SequenStack *)malloc(sizeof(SequenStack));1819 if (S == NULL)20 {21 return S;22 }23 S->top = -1;24 return S;25 }2627 /* 判空栈(顺序栈)*/28 int SequenStack_Empty(SequenStack * S)29 {30 if (S->top == -1)31 {32 return 1;33 }34 else35 {36 return 0;37 }38 }3940 /* ⼊栈(顺序栈) */41 int Push_SequenStack(SequenStack * S, elemtype x)42 {43 if (S->top >= MAXSIZE-1)44 {45 return 0;46 }47 S->top++;48 S->data[S->top] = x;49 return 1;50 }5152 /* 出栈(顺序栈) */53 int Pop_SequenStack(SequenStack * S, elemtype * x)54 {55 if (S->top == -1)56 {57 return 0;58 }59 else60 {61 S->top--;62 *x = S->data[S->top+1];63 return 1;64 }65 }6667 /* 进制转换算法 */68 void SequenStackConversion(int N)69 {70 int x;71 SequenStack * S = Init_SequenStack();72 while (N > 0)73 {74 Push_SequenStack(S, N % 2);75 N = N / 2;76 }77 while (! SequenStack_Empty(S))78 {79 Pop_SequenStack(S, &x);80 printf("%d", x);81 }82 }8384 int main()85 {86 int N;87 printf("Please enter the decimal number you want want to convert:\n");88 scanf("%d", &N);89 printf("The converted binary number is:\n");90 SequenStackConversion(N);91 }实现结果:利⽤链栈栈实现数制转换(以⼗进制转换为⼆进制为例)1 #include <stdio.h>2 #include <stdlib.h>34 /*定义链栈*/5 typedef int elemtype;6 typedef struct LinkedStackNode7 {8 elemtype data;9 struct LinkedStackNode *next;10 }LinkedStackNode, *LinkedStack;11 LinkedStack top;1213 /*链栈的初始化*/14 LinkedStack Init_LinkedStack()15 {16 LinkedStack top = (LinkedStackNode *)malloc(sizeof(LinkedStackNode));1718 if(top != NULL)19 {20 top->next = NULL;21 }22 return top;23 }2425 /*判栈空*/26 int LinkedStack_Empty(LinkedStack top)27 {28 if (top->next == NULL)29 {30 return 1;31 }32 else33 {34 return 0;35 }3637 }3839 /*⼊栈*/40 int Push_LinkedStack(LinkedStack top, elemtype x)41 {42 LinkedStackNode *node;43 node = (LinkedStackNode *)malloc(sizeof(LinkedStackNode));4445 if (node == NULL)46 {47 return 0;48 }49 else50 {51 node->data = x;52 node->next = top->next;53 top->next = node;54 return 1;55 }5657 }5859 /*出栈*/60 int Pop_LinkedStack(LinkedStack top, elemtype * x)61 {62 LinkedStackNode *node;63 if (top->next == NULL)64 {65 return 0;66 }67 else68 {69 node = top->next;70 *x = node->data;71 top->next = node->next;72 free(node);73 return 1;74 }7576 }7778 /*进制转换*/79 void ListStackConversion(int N)80 {81 int x;82 LinkedStack S = Init_LinkedStack();83 while (N > 0)84 {85 Push_LinkedStack(S, N % 2);86 N = N / 2;87 }88 while (! LinkedStack_Empty(S))89 {90 Pop_LinkedStack(S, &x);91 printf("%d", x);92 }9394 }9596 int main()97 {98 int N;99 printf("Please enter the decimal number you want want to convert:\n"); 100 scanf("%d", &N);101 printf("The converted binary number is:\n");102 ListStackConversion(N);103 }实现结果:把顺序栈和链栈两种功能综合在⼀起实现数制转换(以⼗进制转换为⼗六进制为例)1 /* 进制转换 */2 #include <stdlib.h>3 #include <stdio.h>4 #define MAXSIZE 100 /*定义顺序栈的长度*/56 /*定义顺序栈*/7 typedef int elemtype;8 typedef struct SequenStack9 {10 elemtype data[MAXSIZE];11 int top;12 }SequenStack;1314 /*定义链栈*/15 typedef int elemtype;16 typedef struct LinkedStackNode17 {18 elemtype data;19 struct LinkedStackNode *next;20 }LinkedStackNode, *LinkedStack;21 LinkedStack top;2223 /* 顺序栈初始化 */24 SequenStack * Init_SequenStack()25 {26 SequenStack * S;27 S = (SequenStack *)malloc(sizeof(SequenStack));2829 if (S == NULL)30 {31 return S;32 }33 S->top = -1;34 return S;35 }3637 /*链栈的初始化*/38 LinkedStack Init_LinkedStack()39 {40 LinkedStack top = (LinkedStackNode *)malloc(sizeof(LinkedStackNode));4142 if(top != NULL)43 {44 top->next = NULL;45 }46 return top;47 }4849 /*判栈(顺序栈)空*/50 int SequenStack_Empty(SequenStack * S)51 {52 if (S->top == -1)53 {54 return 1;55 }56 else57 {58 return 0;59 }60 }6162 /* 判栈(链栈)空 */63 int LinkedStack_Empty(LinkedStack top)65 if (top->next == NULL)66 {67 return 1;68 }69 else70 {71 return 0;72 }7374 }7576 /* ⼊栈(顺序栈)*/77 int Push_SequenStack(SequenStack * S, elemtype x)78 {79 if (S->top >= MAXSIZE-1)80 {81 return 0;82 }83 S->top++;84 S->data[S->top] = x;85 return 1;86 }8788 /* 出栈(顺序栈) */89 int Pop_SequenStack(SequenStack * S, elemtype * x)90 {91 if (S->top == -1)92 {93 return 0;94 }95 else96 {97 S->top--;98 *x = S->data[S->top+1];99 return 1;100 }101 }102103 /* ⼊栈(链栈) */104 int Push_LinkedStack(LinkedStack top, elemtype x)105 {106 LinkedStackNode *node;107 node = (LinkedStackNode *)malloc(sizeof(LinkedStackNode)); 108109 if (node == NULL)110 {111 return 0;112 }113 else114 {115 node->data = x;116 node->next = top->next;117 top->next = node;118 return 1;119 }120121 }122123 /* 出栈(链栈) */124 int Pop_LinkedStack(LinkedStack top, elemtype * x)125 {126 LinkedStackNode *node;127 if (top->next == NULL)128 {129 return 0;130 }131 else132 {133 node = top->next;134 *x = node->data;135 top->next = node->next;136 free(node);137 return 1;138 }139140 }141142 /* 使⽤顺序⽅式进⾏进制转换的函数 */143 void SequenStackConversion(int N)144 {145 int x;146 SequenStack * S = Init_SequenStack();147 while (N > 0)149 Push_SequenStack(S, N % 16); 150 N = N / 16;151 }152 while (! SequenStack_Empty(S))153 {154 Pop_SequenStack(S, &x);155 switch (x)156 {157 case 10:158 printf("A");159 break;160 case 11:161 printf("B");162 break;163 case 12:164 printf("C");165 break;166 case 13:167 printf("D");168 break;169 case 14:170 printf("E");171 break;172 case 15:173 printf("F");174 break;175 default:176 printf("%d", x);177 break;178 }179 }180 }181182 /* 使⽤链栈⽅式进⾏进制转换的函数 */ 183 void ListStackConversion(int N)184 {185 int x;186 LinkedStack S = Init_LinkedStack(); 187 while (N > 0)188 {189 Push_LinkedStack(S, N % 16);190 N = N / 16;191 }192 while (! LinkedStack_Empty(S))193 {194 Pop_LinkedStack(S, &x);195 switch (x)196 {197 case 10:198 printf("A");199 break;200 case 11:201 printf("B");202 break;203 case 12:204 printf("C");205 break;206 case 13:207 printf("D");208 break;209 case 14:210 printf("E");211 break;212 case 15:213 printf("F");214 break;215 default:216 printf("%d", x);217 break;218 }219220 }221222 }223224 void function()225 {226 printf("-------------------------------------------\n"); 227 }228229 /* 主函数调⽤进制转换函数 */230 int main()231 {232 int N, x;233 printf("Please enter the decimal number you want want to convert:\n");234 scanf("%d", &N);235 function();236 printf("Choose using sequential stack or list stack\n");237 printf("1:Sequential stack 2:list stack:\n");238 function();239 scanf("%d", &x);240 printf("The converted binary number is:\n");241 switch (x)242 {243 case 1:244 SequenStackConversion(N);245 break;246 case 2:247 ListStackConversion(N);248 break;249 default:250 printf("error");251 break;252 }253254 return 0;255 }值得注意的是,当⼗进制转换为⼗六进制的时候,需要考虑输出现实⼤于9的⼗六进制位数,这⾥我们考虑可以使⽤switch开关实现。

数据结构实验三栈和队列的应用

数据结构实验三栈和队列的应用

数据结构实验三栈和队列的应用数据结构实验三:栈和队列的应用在计算机科学领域中,数据结构是组织和存储数据的重要方式,而栈和队列作为两种常见的数据结构,具有广泛的应用场景。

本次实验旨在深入探讨栈和队列在实际问题中的应用,加深对它们特性和操作的理解。

一、栈的应用栈是一种“后进先出”(Last In First Out,LIFO)的数据结构。

这意味着最后进入栈的元素将首先被取出。

1、表达式求值在算术表达式的求值过程中,栈发挥着重要作用。

例如,对于表达式“2 + 3 4”,我们可以通过将操作数压入栈,操作符按照优先级进行处理,实现表达式的正确求值。

当遇到数字时,将其压入操作数栈;遇到操作符时,从操作数栈中弹出相应数量的操作数进行计算,将结果压回操作数栈。

最终,操作数栈中的唯一值就是表达式的结果。

2、括号匹配在程序代码中,检查括号是否匹配是常见的任务。

可以使用栈来实现。

遍历输入的字符串,当遇到左括号时,将其压入栈;当遇到右括号时,弹出栈顶元素,如果弹出的左括号与当前右括号类型匹配,则继续,否则表示括号不匹配。

3、函数调用和递归在程序执行过程中,函数的调用和递归都依赖于栈。

当调用一个函数时,当前的执行环境(包括局部变量、返回地址等)被压入栈中。

当函数返回时,从栈中弹出之前保存的环境,继续之前的执行。

递归函数的执行也是通过栈来实现的,每次递归调用都会在栈中保存当前的状态,直到递归结束,依次从栈中恢复状态。

二、队列的应用队列是一种“先进先出”(First In First Out,FIFO)的数据结构。

1、排队系统在现实生活中的各种排队场景,如银行排队、餐厅叫号等,可以用队列来模拟。

新到达的顾客加入队列尾部,服务完成的顾客从队列头部离开。

通过这种方式,保证了先来的顾客先得到服务,体现了公平性。

2、广度优先搜索在图的遍历算法中,广度优先搜索(BreadthFirst Search,BFS)常使用队列。

从起始节点开始,将其放入队列。

栈的应用教学设计

栈的应用教学设计

出”。

四、栈的应用举例任何一个表达式都是由操作数、运算符和界限符组成的。

后两项统称为算符,算符集合命名为OP。

引入问题:如何用堆栈实现表达式求值?表达式求值有三种形式。

中缀表示:<操作数><运算符><操作数>前缀表示:<运算符><操作数><操作数>后缀表示:<操作数><操作数><运算符>以中缀表达式为例,进行重点讲解。

例2、用栈求解表达式21+44-3*6的值。

# 21+44-3*6#实现方法:设置一个运算符栈和一个操作数栈。

算符间的优先关系求值规则:1)先乘除,后加减;2)先括号内,后括号外;3)同类运算,从左至右。

约定:q1---栈顶的运算符q2---当前的运算符当q1=#,为开始符当q2=#,为结束符根据上述优先关系表,可见21+44-3*6#中‘-’ <‘*’,‘*’ >‘#’。

2、算法基本思想1)首先置‘#’为运算符栈的栈底元素, 操作数栈为空栈;2) 依次读入表达式中各个字符,如果判断为操作数则OPND栈,如21,44,进操作数栈;若为运算符θ2,则和OPTR的栈顶元素θ1比较优先级,θ1和θ2进行比较。

当θ1 < θ2 ,θ2 进栈;表达式21+44-3*6的算法编程实现。

[动画演示]1.5分钟结合算法演示系统,讲解用栈求解表达式21+44-3*6的算法执行过程。

[小结]2分钟栈的定义,栈的“先进后出”的特性;栈的顺序存储的实现;栈的应用。

当θ1 = θ2 ,θ1 出栈;若θ1 > θ2 ,θ1 出栈,先进行操作数求值;然后运算结果再进栈。

3、算法编程实现OperandType EvaluateExpression ( ){ InitStack(OPTR);push(OPTR,`#`);InitStack(OPND);read(w);Whi le NOT ((w=’#’)AND (GetTop(OPTR)= `#`) )[IF w NOT IN op THEN[ push(OPND,w); read(w);ELSE CASEPrecede(GetTop(OPTR),w)OF`<`:[ push(OPTR,c); read(w);]`=`: [pop(OPTR,x);if x=FUNCTION thenPUSH(OPND,x(POP(OPNE)));read(w);]`>`: [b:= pop(OPND);a:= pop(OPND);theta:= pop(OPTR);push(OPND,Operate(a,theta,b));]ENDC; ]RETURN(POP(OPND))ENDF;4、算法执行过程# 21+44-3*6#1)“#”先压入到运算符栈,即push(OPTR,`#`);OPTR OPND2)push(OPND,`21`)2)‘#’ <‘+’,push(OPTR, `+` );3)push(OPND,`44`)。

数制转换数据结构课程设计

数制转换数据结构课程设计

《数据结构》课程设计报告书题目:数制转换系别:计算机科学与应用系学号:学生姓名:指导教师:完成日期:2013—6—1数制转换1.需求分析任意给定一个M进制的数x ,实现如下要求1)求出此数x的10进制值(用MD表示)2)实现对x向任意的一个非M进制的数的转换。

3)至少用两种或两种以上的方法实现上述要求(用栈解决,用数组解决,其它方法解决)。

2.概要设计程序流程可以用以下流程图来刻画:A用数组实现B用栈实现3.详细设计A.用数组实现该问题D2M()函数和M2D()函数是实现该问题的主要函数。

D2M()函数是实现十进制转换为其他进制的函数,它是将输入的十进制数x首先对需要转换的进制M取余,然后在对其取整,接着通过递归调用D2M()函数一次将得到的整数部分一次先取余后取整,并将所得的余数依次存入下一数组,然后逆向去除数组中的元素,即得到转换后的结果。

而M2D()函数是实现其他进制M转换为十进制,并将其转换为非M进制。

M进制转十进制则是从该M 进制数的最后一位开始运算,依次列为第0、1、2、……..N位并分别乘以M的0、1、2、…..N次方,将得到的次方相加便得到对应的十进制数,再调用D2M()函数将其转换为非M进制的数。

B.用栈实现栈具有后进先出的性质,具体实现方法和数组的方法有很大联系,不再过多解释。

4.调试分析(1)构造栈的方法通过查阅书籍知道了。

(2)数组的递归调用查阅相关书籍了解了。

(3)为了让界面表达更清晰,多次调试完善了界面。

5.测试结果下面是我的测试函数及运行结果:A.数组测试结果B栈实现测试结果6.总结通过《数据结构》课程设计,我了解到数据结构是计算机科学中一门综合性的专业基础课。

这次的课程设计使我对数组及栈有了初步的认识,虽然课程设计的不完善,但是在设计过程中我受益匪浅,通过查资料、网上搜索例子,让我学到了很多以前不知道的东西,提高我的分析和解决问题的能力,进一部掌握了应用系统设计的方法和不步骤,,也让我意识到自己所掌握的实在是太少了,只靠课本知识是不够的,应该多多上机调试,这样才能提高自己。

数据结构第三章 栈和队列part2)

数据结构第三章 栈和队列part2)
制转移到调用函数。
多个函数嵌套调用的规则是:
后调用先返回 !
此时的内存管理实行“栈式管理”
例如:
void main( ){ void a( ){


a( );
b( );


}//main
}// a
void b( ){
… 函数b的数据区 函数a的数据区 Main的数据区
}// b
递归函数执行的过程可视为同一 函数进行嵌套调用.
例七、实现递归
当在一个函数的运行期间调用另一个函 数时,在运行该被调用函数之前, 需先完成三项任务:
• 将所有的实在参数、返回地址等信息传 递给被调用函数保存;
• 为被调用函数的局部变量分配存储区; • 将控制转移到被调用函数的入口。
从被调用函数返回调用函数之前,应该 完成下列三项任务:
• 保存被调函数的计算结果; • 释放被调函数的数据区; • 依照被调函数保存的返回地址将控
从原表达式求得后缀式的规律为:
1) 设立操作数栈; 2) 设表达式的结束符为“#”,
预设运算符栈的栈底为“#”;
3) 若当前字符是操作数, 则直接发送给后缀式。
从原表达式求得后缀式的规律为:
4) 若当前运算符的优先数高于栈顶运算 符,则进栈;
5) 否则,退出栈顶运算符发送给后缀式;
6) “(” 对它之前后的运算符起隔离作 用,“)”可视为自相应左括弧开始的 表达式的结束符。
// 从终端接收下一个字符
}
将从栈底到栈顶的字符传送至调用过程的数据区;
ClearStack(S);
// 重置S为空栈
if (ch != EOF) ch = getchar();
}

数据结构—数制转换

数据结构—数制转换

数据结构—数制转换
数据结构—数制转换
⒈简介
本文档介绍了数制转换的概念、原理及常用的数制转换方法。

数制转换是将一个数从一种数制表示转换为另一种数制表示的过程,常见的数制包括二进制、十进制、八进制和十六进制。

⒉二进制到十进制转换
⑴方法一:加权方法
⑵方法二:除以基数方法
⒊十进制到二进制转换
⑴方法一:除以2取余倒序排列
⑵方法二:除以基数逆序排列
⒋八进制与十进制之间的转换
⑴八进制到十进制转换方法
⑵十进制到八进制转换方法
⒌十六进制与十进制之间的转换
⑴十六进制到十进制转换方法
⑵十进制到十六进制转换方法
⒍附件
本文档附带了数制转换的示例题目和解答,供读者练习和参考。

⒎法律名词及注释
⑴数制:在数学中,数制(Radix,Base)也叫基数,是指用来
计数的个数。

常见的数制包括二进制、十进制、八进制和十六进制。

⑵二进制:二进制是一种基于二的数制系统,只有两个数字0
和1.在计算机中,二进制是最基础且最常用的数制之一。

⑶十进制:十进制是一种基于十的数制系统,包含数字0-9.
十进制是人们生活和计算中最常用的数制。

⑷八进制:八进制是一种基于八的数制系统,包含数字0-7.
在计算中,八进制常用于表达一些特殊的数据。

⑸十六进制:十六进制是一种基于十六的数制系统,包含数字
0-9和字母A-F。

在计算机科学和工程领域中,十六进制常用于表示
二进制数据和存储地质。

数据结构实验2数制转换

数据结构实验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;}四、实验结果。

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

中北大学数据结构与算法课程设计说明书学院、系:软件学院专业:软件工程学生姓名:xxx 学号:xxxx设计题目:数制转换问题起迄日期: 2013年12月9日- 2013年12月20日指导教师:xxx2013 年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(intg,int h)实现向非十六进制数的转换;⑸void main()是主函数,功能是给出测试的数据,并在特定条件下调用D2M()函数和M2D()函数。

2、用栈实现该问题:⑴SqStack定义栈,说明base为栈底指针,top为栈顶指针,stacksize为栈容量;⑵int InitStack(SqStack &S)到int DestroyStack(SqStack &S)六大模块分别表示构造一个空栈、用e表示栈元素、插入元素、删除元素、判断栈是否为空以及摧毁栈;⑶SqStack S是指定义栈S;⑷DtoM(int a,int b)的功能是将十进制数转换成M进制的函数;⑸MtoD()的功能是M进制转换为十进制的函数;⑹void main()是主函数。

其功能是输入需要测试的数据以及需要转换的进制,并在特定情形下调用DtoM()函数和MtoD()函数,而且实现M进制数向任意非M进制数的转换。

3、详细设计源程序有两个,shuzu.cpp是用数组实现该问题的程序,而stack.cpp是用栈实现该问题的程序:[文件shuzu.cpp]#include<stdio.h>#include<math.h>#include<malloc.h>#include<stdlib.h>#define N 1000// 以下为DtoM(int g,int h)是实现十进制数转换为M进制数的函数,DtoM(int g,int h){int c[N];int i=0;int j;int reminder;reminder=g%h;g=g/h;if(reminder>9){c[i]=reminder+55;i++;}else{c[i]=reminder;i++;}if(g>0)DtoM(g,h);for(j=i-1;j>=0;j--)if(c[j]>=65)printf("%c",c[j]);elseprintf("%d",c[j]);}//以下MtoD()是实现M(仅指二进制数和八进制数)进制数转换为十进制数的函数,并在其中调用D2M(int g,int h)实现向非M进制数的转换MtoD(int e) //二进制和八进制数转换为十进制数,并这转换为其他进制数{int n,i,y=0,j,s;int a[N];printf("请输入%d进制位数:",e);scanf("%d",&n);j=0;printf("请输入%d进制的每位并使每位用空格隔开:",e);for(i=n-1;i>=0;i--)scanf("%d",&a[i]);for(i=0;i<n;i++){y+=(int)pow(e,j)*a[i]; //强制类型转换,以免造成数据丢失j++;}printf("所得的10进制的结果:%d ",y);printf("\n需要转换的进制M:");scanf("%d",&s);printf("请输出转换成%d进制的结果:",s);DtoM(y,s);return 0;}//以下为HtoD(int f)是实现十六进制数转换为十进制数的函数,并在其中调用D2M(int g,int h)实现向非十六进制数的转换HtoD(int f) //十六进制数转换为十进制数,并转换为其他进制数{int n,j=0,y=0,i,s;int b[N];printf("请输入%d进制位数:",f);scanf("%d",&n);printf("请输入%d进制的每位并使每位用空格隔开:",f);for(i=0;i<n;i++)scanf("%x",&b[i]);for(i=n-1;i>=0;i--){y+=(int)pow(f,j)*b[i]; //强制类型转换,以免造成数据丢失 j++;}printf("请输出所得的10进制的结果: ");printf("%d",y);printf("\n需要转换的进制M:");scanf("%d",&s);printf("请输出转换成%d进制的结果:",s);DtoM(y,s);return 0;}// void main()是主函数,功能是给出测试的数据,并在特定条件下调用DtoM()函数和MtoD()函数void main(){int m,r,x,t;for(;;){printf("\n\t\t* * * * * * ^-^ welcome !!! ^-^ * * * * * * \n");printf("\t\t 数制转换系统 \n");printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n");printf("\t\t \n");printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n");printf("\t\t* 1. 进入数制转换系统 *\n");printf("\t\t* 2. 退出该系统 *\n");printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n");printf("\t\t 请选择(1-2):");loop:scanf("%d",&t);switch(t){ case 1:printf("请给定一个需转换的进制M(2 or 8 or 10 or 16):");scanf("%d",&m);if(m==2||m==8) //二进制和八进制转换成十进制MtoD(m);else if(m==16) //十六进制转换成十进制HtoD(m);else if(m==10) //十进制转换成其它进制{printf("请输入一个%d进制数:",m);scanf("%d",&x);printf("请输入需要转换成的进制M(2 or 8 or 16):");scanf("%d",&r);printf("请输出转换成%d进制的结果:",r);DtoM(x,r);printf("\n");} break;case 2: exit(0);default:{ printf("输入有误,请重新选择:");goto loop;}printf("\n");}}}[文件stack.cpp]#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<math.h>#define STACK_INIT_SIZE 100 //存储空间初始分配量#define STACKINCREMENT 10 //存储空间分配增量int e,m,x,s,t; //x为要转换的十进制数,e 为临时用的的int型变量int r,y,i,n;typedef struct{int *base; //栈底int *top; //栈顶int stacksize; //栈容量}SqStack;// SqStack定义栈,说明base为栈底指针,top为栈顶指针,stacksize为栈容量/*一下为int InitStack(SqStack &S)到int DestroyStack(SqStack &S)六大模块分别表示构造一个空栈、用e表示栈元素、插入元素、删除元素、判断栈是否为空以及摧毁栈;*/ 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;}int GetTop(SqStack S, int &e){//若栈不为空,则用e返回S的栈顶元素,并返回0,否则返回1if(S.top==S.base) return 1;e=*(S.top-1);return 0;}int Push(SqStack &S , int e){ //插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksize){ //栈满,追加存储空间S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));if(!S.base) return 1 ; //存储分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return 0;}int Pop(SqStack &S, int &e){//若栈不空,则删除S的栈顶元素,用e返回其值,并返回0,否则返回1 if(S.top==S.base) return 1;e=*--S.top;return 0;}int StackEmpty(SqStack S){ //若栈空,则返回1,否则返回0 if(S.top==S.base)return 1;return 0 ;}int DestroyStack(SqStack &S){ //销毁栈S,栈S不再存在free(S.base);S.top=NULL; //防止程序后面不小心使用了它S.base=S.top;return 0 ;}//以下 SqStack S是指定义栈SSqStack S; //定义栈S// 下面的D2M(int a,int b)的功能是将十进制数转换成M进制的函数DtoM(int a,int b) //十进制转换成其他进制的函数DtoM() {while(a){r=a%b;if(r>9)r=r+55;Push(S,r); //压入栈a/=b; //转换成M进制}printf("该数转换成%d进制的结果:",b);while(!StackEmpty(S)){Pop(S,e); //弹出栈if(e>=65)printf("%c",e);elseprintf("%d",e);}return 0;}// 下面是MtoD(),它的功能是M进制转换为十进制的函数MtoD() //其他进制转换为十进制的函数MtoD() {char c[1000];printf("请输入需要转换的数的位数:");scanf("%d",&n);printf("请输入需要转换的数的每位并用空格隔开:");for(i=0;i<n;i++){scanf("%x",&c[i]);Push(S,c[i]);}i=0;while(!StackEmpty(S)){Pop(S,e);y+=(int)pow(m,i)*e;i++;}printf("转换成10进制的结果是:");printf("%d",y);return 0;}//void main()是主函数。

相关文档
最新文档