数据结构课程设计 数制转换 数组和栈
数据结构实验指导书(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语⾔数据结构)数制转换在计算机中经常⾯对不同数制的转换问题,如将⼀个⼗进制数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)
多个函数嵌套调用的规则是:
后调用先返回 !
此时的内存管理实行“栈式管理”
例如:
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数制转换
实验二、数制转换一、实验目的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;}四、实验结果。
数据结构课程设计 数制转换
#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)
2.1、系统分析
2.1.1、用数组实现该问题:
DtoM()函数和MtoD()函数是实现该问题的主要函数。DtoM()函数是实现十进制转换为其它进制的函数,它是将输入的十进制数x取首先对需要转换的进制M取余,然后再对其取整,接着通过递归调用DtoM()函数依次将得到的整数部分依次先取余后取整,并将所得的余数依次存入一个数组中,然后逆向取出数组中的元素,即得到转换后的结果。而MtoD()函数则是实现其他进制M转换为十进制,并将其转换为非M进制的数。M进制转十进制则是从该M进制数的最后一位开始算,依次列为第0、1、2…n位并分别乘以M的0、1、2…n次方,将得到的次方相加便得到对应的十进制数,再调用DtoM()函数将其转换为非M进制的数。2.1.2用栈实现该问题:
同样是利用DtoM()和MtoD()两个函数实现。两个函数的思想同利用数组实现时相同。只是栈具有后进先出的性质,故其用Pop()取数较数组的逆向取数方便些。
2.2、模块划分
2.2.1、用数组实现该问题:
⑴i,j,y,n,s,m,r,reminder,x是定义的全局变量,初始值都为0;
⑵DtoM(int g,int h)是实现十进制数转换为M进制数的函数;
scanf("%d",&n);
3数据结构教案 - 栈和队列
1.结合栈在迷宫求解、表达式实现和递归实现实例解释数据结构的基本概念,增强学生对栈数据结构的兴趣;
2.栈和队列对比学习,对比他们的相同点和不同点加深对基本概念和应用的理解。
作业布置
设Q[0,6]是一个静态顺序队列,初始状态为front=rear=0,请画出做完下列操作后队列的头尾指针的状态变化情况,若不能入对,请指出其元素,并说明理由。(1)a, b, c, d入队;(2)a, b, c出队;(3)i , j , k , l , m入队;(4)d, i出队;(5)n, o, p, q, r入队。
掌握:栈和队列在表达式求值、括号匹配、数制转换、迷宫求解中的应用
主要知识点、重点、难点
知识点:栈和队列的定义、表示和实现;栈在数值转换、括号匹配、行编辑程序、迷宫求解、表达式求解和递归实现方面的应用;队列的定义、表示和实现;队列的链式表示和顺序表示及实现。
重点难点:栈、队列的设计和实现以及基本操作及相关算法及栈和队列的典型应用。
作业布置设q06是一个静态顺序队列初始状态为frontrear0请画出做完下列操作后队列的头尾指针的状态变化情况若不能入对请指出其元素并说明理由
Байду номын сангаас课程名称
数据结构B
章节名称
栈和队列
授课学时
总课时:2课堂讲授:2
教学目标与要求:
了解:栈与队列的定义、特点和性质;
掌握:栈、队列的设计和实现以及基本操作及相关算法
数据结构课程中栈和队列实验教学方案设计
数据结构课程中栈和队列实验教学方案设计嘿,同学们!今天咱们要来聊聊如何在数据结构课程中设计一个关于栈和队列的实验教学方案。
相信我,这会是一个非常有趣和实用的过程,让我们一起动手打造一个既好玩又有料的实验方案吧!一、教学目标咱们得明确教学目标。
在这个实验中,我们希望学生们能够:1.理解栈和队列的概念及特点。
2.掌握栈和队列的常见操作。
3.学会使用栈和队列解决实际问题。
二、教学内容1.栈的概念、特点及应用场景。
2.队列的概念、特点及应用场景。
3.栈和队列的常见操作,如初始化、入栈、出栈、入队、出队等。
4.栈和队列的存储结构及其实现。
三、实验设计1.实验名称:数据结构课程中栈和队列实验教学。
2.实验时间:2课时。
3.实验环境:计算机实验室。
4.实验内容:(1)导入:通过讲解栈和队列的概念、特点及应用场景,让学生对这两种数据结构有一个初步的认识。
(2)栈的实验:a.实现一个栈的初始化、入栈、出栈操作。
b.实现一个逆序输出字符串的算法,使用栈来实现。
c.实现一个判断括号是否匹配的算法,使用栈来实现。
(3)队列的实验:a.实现一个队列的初始化、入队、出队操作。
b.实现一个循环队列,并演示其工作原理。
c.实现一个计算表达式值(包括加减乘除)的算法,使用栈和队列实现。
5.实验步骤:(1)讲解实验内容和要求。
(2)分组讨论,每组选择一个实验内容进行深入研究。
(3)编写代码实现实验功能。
(4)调试代码,确保实验功能正确。
四、实验评价1.代码的正确性:是否实现了实验要求的功能。
2.代码的可读性:代码结构是否清晰,注释是否完整。
3.实验报告的完整性:报告是否包含了实验原理、实验步骤、实验结果分析等内容。
4.实验过程中的参与程度:学生是否积极参与讨论,主动寻求解决问题。
五、实验拓展1.实现一个栈和队列的综合应用案例,如模拟一个停车场管理系统。
2.学习使用其他编程语言实现栈和队列,如Python、Java等。
3.探索栈和队列在计算机科学领域的其他应用,如算法设计、操作系统等。
数制转换数据结构课程设计报告
数制转换数据结构课程设计报告一、课程设计目的本次数制转换数据结构课程设计的主要目的是通过实际编程实现不同数制之间的转换,加深对数据结构和算法的理解和运用。
具体而言,包括熟练掌握栈和队列等数据结构,以及运用递归、循环等算法思想来解决实际问题。
二、需求分析数制转换是计算机科学中常见的操作,常见的数制包括二进制、八进制、十进制和十六进制。
用户需要输入一个数以及其对应的原始数制,然后选择要转换的目标数制,程序能够准确地进行转换并输出结果。
三、数据结构选择在本次课程设计中,选择使用栈来实现数制转换。
栈具有后进先出的特点,非常适合在数制转换中进行余数的存储和处理。
四、算法设计(一)十进制转换为其他进制1、十进制转换为二进制:采用除 2 取余的方法,将每次除法的余数压入栈中,最后依次出栈得到二进制数。
2、十进制转换为八进制:采用除 8 取余的方法,与二进制类似,将余数压入栈中,最后出栈得到八进制数。
3、十进制转换为十六进制:除 16 取余,不过余数可能是 0 9 以及A F ,需要进行特殊处理。
(二)其他进制转换为十进制1、二进制转换为十进制:从右往左依次用二进制位上的数字乘以2 的相应位数的幂,然后将结果相加。
2、八进制转换为十进制:从右往左依次用八进制位上的数字乘以8 的相应位数的幂,然后将结果相加。
3、十六进制转换为十进制:从右往左依次用十六进制位上的数字乘以 16 的相应位数的幂,然后将结果相加。
A F 分别表示 10 15 。
(三)其他进制之间的转换通过先将原始进制转换为十进制,再将十进制转换为目标进制来实现。
五、程序实现以下是使用 C 语言实现的部分核心代码:```cinclude <stdioh>include <stdlibh>//定义栈的数据结构typedef struct Stack {int data;int top;int capacity;} Stack;//创建栈Stack createStack(int capacity) {Stack stack =(Stack )malloc(sizeof(Stack));stack>data =(int )malloc(capacity sizeof(int));stack>top =-1;stack>capacity = capacity;return stack;}//入栈操作void push(Stack stack, int element) {if (stack>top == stack>capacity 1) {printf("Stack Overflow!\n");return;}stack>data++stack>top = element;}//出栈操作int pop(Stack stack) {if (stack>top ==-1) {printf("Stack Underflow!\n");return -1;}return stack>datastack>top;}//十进制转二进制void decimalToBinary(int decimal) {Stack stack = createStack(32);while (decimal > 0) {push(stack, decimal % 2);decimal /= 2;while (stack>top!=-1) {printf("%d", pop(stack));}printf("\n");free(stack>data);free(stack);}//十进制转八进制void decimalToOctal(int decimal) {Stack stack = createStack(16);while (decimal > 0) {push(stack, decimal % 8);decimal /= 8;}while (stack>top!=-1) {printf("%d", pop(stack));printf("\n");free(stack>data);free(stack);}//十进制转十六进制void decimalToHexadecimal(int decimal) {Stack stack = createStack(16);while (decimal > 0) {int remainder = decimal % 16;if (remainder < 10) {push(stack, remainder +'0');} else {push(stack, remainder 10 +'A');}decimal /= 16;}while (stack>top!=-1) {printf("%c", pop(stack));}printf("\n");free(stack>data);free(stack);}//二进制转十进制int binaryToDecimal(char binary) {int decimal = 0, power = 1;int length = strlen(binary);for (int i = length 1; i >= 0; i) {if (binaryi =='1'){decimal += power;}power = 2;}return decimal;}//八进制转十进制int octalToDecimal(char octal) {int decimal = 0, power = 1;int length = strlen(octal);for (int i = length 1; i >= 0; i) {decimal +=(octali '0') power;power = 8;}return decimal;}//十六进制转十进制int hexadecimalToDecimal(char hexadecimal) {int decimal = 0, power = 1;int length = strlen(hexadecimal);for (int i = length 1; i >= 0; i) {if (hexadecimali >='0' && hexadecimali <='9'){decimal +=(hexadecimali '0') power;} else if (hexadecimali >='A' && hexadecimali <='F'){decimal +=(hexadecimali 'A' + 10) power;}power = 16;}return decimal;}int main(){int choice, decimal;char sourceNumber32;printf("1、 Decimal to Binary\n");printf("2、 Decimal to Octal\n");printf("3、 Decimal to Hexadecimal\n");printf("4、 Binary to Decimal\n");printf("5、 Octal to Decimal\n");printf("6、 Hexadecimal to Decimal\n");printf("Enter your choice: ");scanf("%d",&choice);switch (choice) {case 1:printf("Enter decimal number: ");scanf("%d",&decimal);decimalToBinary(decimal);break;case 2:printf("Enter decimal number: ");scanf("%d",&decimal);decimalToOctal(decimal);break;case 3:printf("Enter decimal number: ");scanf("%d",&decimal);decimalToHexadecimal(decimal);break;case 4:printf("Enter binary number: ");scanf("%s", sourceNumber);printf("%d\n", binaryToDecimal(sourceNumber));break;case 5:printf("Enter octal number: ");scanf("%s", sourceNumber);printf("%d\n", octalToDecimal(sourceNumber));break;case 6:printf("Enter hexadecimal number: ");scanf("%s", sourceNumber);printf("%d\n", hexadecimalToDecimal(sourceNumber));break;default:printf("Invalid choice!\n");}return 0;}```六、测试与结果分析(一)测试用例1、十进制 10 转换为二进制、八进制、十六进制。
数据结构 数制转换
数据结构数制转换
数据结构之数制转换
==================
⒈介绍
在计算机科学和编程中,数制转换是非常常见的操作。
它涉及将一个数值从一种进制表示转换为另一种进制表示。
常见的进制包括二进制、八进制、十进制和十六进制。
数制转换对于理解计算机内部表示、编码和解码以及算法实现等领域非常重要。
⒉二进制数制
⑴二进制数的表示
⑵二进制数与十进制数之间的转换
⑶二进制数与十六进制数之间的转换
⑷二进制数的运算
⒊八进制数制
⑴八进制数的表示
⑵八进制数与十进制数之间的转换
⑶八进制数与二进制数之间的转换
⑷八进制数的运算
⒋十进制数制
⑴十进制数的表示
⑵十进制数与二进制数之间的转换
⑶十进制数与八进制数之间的转换
⑷十进制数与十六进制数之间的转换
⑸十进制数的运算
⒌十六进制数制
⑴十六进制数的表示
⑵十六进制数与二进制数之间的转换
⑶十六进制数与八进制数之间的转换
⑷十六进制数与十进制数之间的转换
⑸十六进制数的运算
⒍附件
本文档涉及的附件包括:
●示例代码: 数制转换的实现示例代码。
●相关案例: 数制转换在实际应用中的案例分析。
⒎法律名词及注释
●进制:表示数值的基数,例如二进制的基数为2,十进制的基数为10.
⒏结束语
本文介绍了数据结构中的数制转换,包括二进制、八进制、十进制和十六进制的表示方式、相互转换方法以及运算规则。
希望通过本文的学习,您能更好地理解数制转换的原理和应用。
数据结构课程设计之任意进制转换
##大学数据结构课程设计报告题目:数值转换院(系):计算机工程学院学生姓名:班级:学号:起迄日期: 6月16号到6月30号指导教师:20XX—20XX年度第 2 学期一、需求分析1.问题描述:任意给定一个M进制的数x ,请实现如下要求1) 求出此数x的10进制值(用MD表示)2) 实现对x向任意的一个非M进制的数的转换。
3) 至少用两种或两种以上的方法实现上述要求(用栈解决,用数组解决,其它方法解决)。
2.基本功能本程序用三种方法,实现把一个M进制数x转换成其他进制数,分别是数组,递归,栈。
1.把其他进制数转换成十进制包含在一个函数中:int getdex();2.把十进制转换成其他进制数用了三种方法(数组,递归,栈),数组:void array(int N)。
递归:void prind_d(int n,int c)。
栈:void initstack(stack&s) ,void push(stack &s,char e),void pop(stack s)。
3.实现把一个M进制数x转换成其他进制数:先把M进制数转换成十进制数,再把十进制数转换成其他进制数。
封装在三个函数中:void Array(),void Stack(),void Prind()。
3.输入输出输入要求其他进制数为字符型数据包括在1到9,和A到F这些字符中,输出也是包含在这些字符中。
如果输入超过这些范围进行容错处理。
二、概要设计1.设计思路:把M进制数转换成其他进制数,可以先把M进制数转换成十进制数,调用int getdex();再把十进制数转换成其他进制数(三种方法:数组,递归,栈);最后把这两个步骤结合在一起。
封装在三个函数中::void Array(),void Stack(),void Prind();通过switch语句进行选择采用哪种方法转换。
2.数据结构设计:抽象数据类型栈:ADT Stack {数据对象:D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 }数据关系:R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n }约定an 端为栈顶,a1 端为栈底。
数据结构数制转换
实验一栈的应用数制转换1.程序设计简介该程序以顺序栈为工具,实现十进制数到其他一至十六进制数的转换。
设计中采用了一个循环,使得用户可重复进行数制转换。
需转换的十进制数与要转换的数制均通过交互方式输入。
因采用了顺序栈,程序中包含SqStack.h 。
2.源程序#include<iostream.h>//cout,cin#include"process.h"//exit()#include"stdio.h"//EOF,NULL#include"SqStack.h"template<class T>void convert(T n,T m){//把十进制数n转换为m进制数T e;char c;SqStack<int> s(10);cout<<"需转换的十进制数是:"<<n<<endl;while(n){try{s.Push(n%m);}catch(char *err){ cout<<err<<endl; }n=n/m;}cout<<"转换为"<<m<<"进制数为:";while(!s.StackEmpty()){try{ e=s.Pop ();if(e<10)cout<<e<<'\t';else{c='A'+e-10;cout<<c<<'\t';}}catch(char *err){ cout<<err<<endl; }}//cout<<endl;}void main(){int n,m;//分别存放被转换的数及转换数制char ans; //工作变量,存放是否继续的应答int flag=1;//工作变量,是否继续的标志while(flag){cout<<"输入需转换的十进制数: ";cin>>n;cout<<"输入需转换的数制: ";cin>>m;convert(n,m);cout<<"继续吗(Y/N)?"<<endl;cin>>ans;if(ans=='Y'||ans=='y')flag=1;else {flag=0;cout<<"程序运行结束,BYe-Bye!"<<endl;}}//while}//main3.程序运行结果实验二表达式括号匹配配对判断问题1.问题描述假设一个算法表达式中包括圆括号、方括号两种,设计判别表达式中括号是否正确匹配的算法。
c语言课程设计数制转换
c语言课程设计数制转换一、教学目标本节课的教学目标是使学生掌握C语言中数制转换的基本方法和技巧,包括十进制、二进制、八进制和十六进制的相互转换。
学生需要了解各种数制的特点和转换规则,能够运用C语言编写程序实现不同数制之间的转换。
通过本节课的学习,学生将能够熟练运用C语言进行数制转换,提高编程能力和逻辑思维能力。
二、教学内容本节课的教学内容主要包括以下几个部分:1.数制的概念和特点:介绍十进制、二进制、八进制和十六进制的基本概念和特点,使学生了解各种数制之间的联系和区别。
2.数制转换规则:讲解各种数制之间的转换规则,包括相邻数制的转换和跨数制的转换。
学生需要掌握转换方法,并能够运用C语言实现不同数制之间的转换。
3.编程实践:通过编程实践,使学生能够运用所学的数制转换规则,编写C语言程序实现不同数制之间的转换。
三、教学方法本节课的教学方法采用讲授法、讨论法和实验法相结合的方式进行:1.讲授法:教师通过讲解数制的概念、特点和转换规则,使学生掌握数制转换的基本知识。
2.讨论法:在讲解数制转换规则时,引导学生进行讨论,加深对数制转换的理解。
3.实验法:安排编程实践环节,使学生在实际操作中运用所学的数制转换知识,提高编程能力。
四、教学资源本节课的教学资源包括教材、参考书、多媒体资料和实验设备:1.教材:选用权威的C语言教材,为学生提供数制转换的基本知识。
2.参考书:提供相关的参考书籍,丰富学生的知识体系。
3.多媒体资料:制作PPT等多媒体资料,生动形象地展示数制转换的规则和实例。
4.实验设备:提供计算机等实验设备,方便学生进行编程实践。
五、教学评估本节课的教学评估将采用多元化的评估方式,以全面、客观地评价学生的学习成果。
评估方式包括:1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解能力。
2.作业:布置与数制转换相关的编程作业,评估学生对所学知识的掌握程度和编程能力。
3.考试:安排一次阶段考试,测试学生对数制转换知识的掌握程度和应用能力。
数据结构实验报告数值转换
利用
void init(Stack *s)
Empty(stack *s)
Push(stack *s)
Pop(stack *s)
这些栈的基本操作实现对十六进制,八进制,二进制的转换。
3.详细设计
void init(struct stack *s){
Void eight();
Void two();Int scan
主函数通过对这几个子函数的调用实现对输入数的进制转换。
此程序包含8个函数
1.栈的初始化;
2.判断站是否为空;
3.元素的进栈;
4.元素的出栈;
5.十六进制的转换;
6.八进制的转换;
7.二进制的转换;
8.菜单显示。
4.调试分析(要写出以下四点,重点是第3点)
s->top=-1;
}
int empty(struct stack *s){
if(s->top==-1)
return 1;
else
return 0;
}
void push(struct stack *s,int i){
if(s->top==MAXSIZE-1){
printf("Stack is full\n");
二、实验内容
1.实现栈的如下基本操作:init ,push , pop, empty, full。
2.利用栈的基本操作实现数制转换,能把任意输入的十进制整数按用户要求转化为2进制或8进制或16进制形式表示。
三、实验要求
1.试描述栈ADT。
2.用顺序存储结构实现栈的基本操作:init, push, pop, empty, full。
数据结构实验报告 栈进制转换
数据结构试验报告栈的应用——进制转换程序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 <stdio.h>#include<malloc.h>#include<stdlib.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OK 1#define ERROR 0#define OVERFLOW -1#define TRUE 1#define FALSE -1typedef struct{int *base;int *top;int stacksize;}Stack;int InitStack(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){if(s->top == s->base){return ERROR;}*e = * -- s->top;return OK;}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");}调试与体会1.调试结果2.体会这次数据结构作业我选择了做进制转换,首先我觉得这个比较有实际意义,其次我觉得做迷宫比较难。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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()是主函数。