2022年数据结构栈的进制转换定义 .pdf
实验三栈的基本操作的实现学号姓名班级:02宋旸 10 计本实验日期 :2012 年3 月 28 日3.1 背景知识熟悉 windows2000操作系统,具有一定的 C 程序设计语言基础,熟悉 Turboc2环境。3.2 实验目的理解栈的定义、 组织形式、结构特征和类型说明以及在相应存储方式下实现的入栈、出栈和获取栈顶元素、判栈空等算法。3.3 工具/准备工作提前编写好所要调试的程序。3.4 实验内容与步骤1将十进制数分别转换为八进制和二进制以及十六进制2要求用栈实现。3验证各操作的正确性。将十进制数 20 和 98 所对应的二进制,八进制和十六进制数分别进行输出。4、小括号的匹配/* Note:Your choice is C IDE */ #include stdio.h #include string.h #include math.h #include limits.h #include stdlib.h #include malloc.h #define TRUE 1 #define OK 1 #define FALSE 0 #define ERROR 0 #define INFEASIBLE -1 typedef int Status; typedef int SElement; #define STACK_INIT_SIZE 10 #define STACKINCREMENT 2 typedef struct SqStack SElement * base ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - SElement * top ; int stacksize ; SqStack; int InitStack (SqStack *S) (* S).base = (SElement * )malloc(STACK_INIT_SIZE * sizeof (SElement) ; if (!(*S).base) exit (OVERFLOW); S-top=S-base; S-stacksize= STACK_INIT_SIZE; return OK; int DestroyStack (SqStack *S) free (S-base); S-base = NULL; S-top = NULL; S-stacksize = 0; return OK; int ClearStack(SqStack *S) S-top = S-base; return OK; int StackEmpty(SqStack S)/判断 sqstack 是否为空 if (S.top = S.base ) return TRUE; elsereturn FALSE ; int StackLength (SqStack S)/返回 s的元素个数 ,即栈的长度 return S.top-S.base ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - int GetTop(SqStack S,int * e)/若栈不为空 ,用e返回 s的栈顶元素 ,并返回 ok if (S.top S.base ) *e=* (S.top-1); return OK; elsereturn ERROR; int Push(SqStack *S,int e)/插入元素 e为新的栈顶元素 if (S-top - S-base = S-stacksize) S-base = (SElement * )realloc (*S).base,(*S).stacksize + STACKINCREMENT *sizeof (SElement); if (!S-base ) exit (OVERFLOW); S-top = S-base + S-stacksize; S-stacksize += STACKINCREMENT; *(S-top) = e; S-top +; return OK; intPop(SqStack *S,int*e) /* 若栈不空 ,则删除 S的栈顶元素 ,用e返回其值 ,并返回 OK; 否则返回 ERROR */ if (* S).top=(* S).base) return ERROR; * e=*- (* S).top; return OK; int StackTraverse (SqStack S ,int (* visit)( int )/ while (S.top S.base ) visit ( *S.base + ); printf ( n ); return OK; void conversion8(SqStack s) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - unsigned n; int e; InitStack ( & s);/初始化栈printf ( n(=0)= ); scanf (%u,& n); while (n)/当 n不为 0 Push (& s,n%8); n=n/8; while (!StackEmpty(s) /当栈不为空 Pop (& s,& e); printf ( %d ,e); printf ( n ); void conversion2(SqStack s) unsigned n; int e; InitStack ( & s);/初始化栈printf ( n(=0)= ); scanf (%u,& n); while (n)/当 n不为 0 Push (& s,n%2); n=n/2; while (!StackEmpty(s) /当栈不为空 Pop (& s,& e); printf ( %d ,e); printf ( n ); void conversion16(SqStack s) unsigned n; char d; int e; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - InitStack ( & s);/初始化栈printf ( n(=0)= ); scanf (%u,& n); while (n)/当 n不为 0 Push (& s,n%2); n=n/2; while (!StackEmpty(s) /当栈不为空 Pop (& s,& e); switch(e) case 0:e=0;printf( %d ,e);break; case 1:e=1;printf( %d ,e);break; case 2:e=2;printf( %d ,e);break; case 3:e=3;printf( %d ,e);break; case 4:e=4;printf( %d ,e);break; case 5:e=5;printf( %d ,e);break; case 6:e=6;printf( %d ,e);break; case 7:e=7;printf( %d ,e);break; case 8:e=8;printf( %d ,e);break; case 9:e=9;printf( %d ,e);break; case 10:d=a;printf( %c ,d);break; case 11:d=b;printf( %c ,d);break; case 12:d=c;printf( %c ,d);break; case 13:d=d;printf( %c ,d);break; case 14:d=e;printf( %c ,d);break; case 15:d=f;printf( %c ,d);break; printf ( %d ,e); printf ( n ); /选择int choose() int d; printf( 请选择你要进行的进制的转换:n); printf( 如果是十进制转换为八进制请选择1n); printf( 如果是十进制转换为二进制请选择2n); printf( 如果是十进制转换为十六进制请选择3n); printf( 如果您想全部转换请选择9n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - printf( 如果想退出请选择0n); printf( n ); scanf(%d ,& d); return d; void main() int f=0; SqStack s; while(!f) switch(choose() case 1:conversion8(s);break; case 2:conversion2(s);break; case 3:conversion16(s); break; case 9:conversion8(s); conversion2(s); conversion16(s); break; case 0: f=-1; default: f=1; 3.5 实验总结名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - 通过查资料等手段,将这个进制转换的程序终于弄了出来,虽然费了很多的功夫,但是还是从中学到了很多。 他使我加深了对栈的理解和运用,使我的知识不单单只停留在表边层次。在这3个进制转换时, 我用的是 3个子函数, 将其分开进行的转换, 使之更加清晰,明了,简洁。二进制与八进制的转换是类似的,都是先建立空栈,进行输入,如果不为空,通过Push (& s,n%2); n =n/2; 进行转换,即可达到效果,而十六进制的转换则要相对麻烦一点,我选择的是较简单的switch.case函数进行的单个数字的判断,输入的不同, 则输出也不同, 这样就能考虑到10以上的数字的输出了。再通过一个子函数来进行页面的操作,这个程序就这样形成了。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -