|
发表于 2016-2-26 02:29:29
|
显示全部楼层
自己写的二进制转换为十六进制作业代码,给各位鱼油参考一下,有更好的也可以分享一下出来
- #include <stdio.h>
- #include <windows.h>
- #include <math.h>
- typedef char ElemType; // 元素类型
- typedef int Status;
-
- #define ERROR 0
- #define OK 1
- typedef struct
- {
- ElemType *base; // 在栈构造之前和销毁之后,base 的值为 NULL
- ElemType *top; // 栈顶指针
- int stackSize; // 当前已经分配的储存空间,以元素为单位
- }sqStack;
- #define STACK_INIT_SIZE 100 // 储存空间初始分配量
- #define STACK_INCREMENT 10 // 储存空间分配增量
- //初始化一个栈
- Status InitStack(sqStack *s)
- {
- if( NULL == s)
- return ERROR;
- s->base = (ElemType *)malloc( STACK_INIT_SIZE * sizeof(ElemType) );
- if( !s->base )
- return ERROR;//exit(0);
-
- s->top = s->base; // 最开始,栈顶就是栈底
- s->stackSize = STACK_INIT_SIZE;
- return OK;
- }
- //压入栈
- Status Push(sqStack *s, ElemType e)
- {
- if( NULL == s)
- return ERROR;
- //如果栈满, 追加空间
- if( s->top - s->base >= s->stackSize )
- {
- s->base = (ElemType *)realloc(s->base, (s->stackSize + STACK_INCREMENT)*sizeof(ElemType));
- if( !s->base )
- return ERROR;// exit(0);
- s->top = s->base + s->stackSize; //设置栈顶
- s->stackSize = s->stackSize + STACK_INCREMENT; //设置新的容量
- }
- *(s->top) = e; //写入元素
- s->top++; //栈顶上移
- return OK;
- }
- //弹出栈
- Status Pop(sqStack *s, ElemType *e)
- {
- if( NULL == s)
- return ERROR;
- if( s->top == s->base ) // 栈已空空是也
- return ERROR;
-
- *e = *--(s->top); //先将栈顶下移,然后取出里面的元素
- return OK;
- }
- //清空栈
- Status ClearStack(sqStack *s)
- {
- if( NULL == s)
- return ERROR;
- s->top = s->base;
- return OK;
- }
- //销毁这个栈
- Status DestroyStack(sqStack *s)
- {
- int i, len;
- if( NULL == s)
- return ERROR;
-
- len = s->stackSize;
-
- for( i=0; i < len; i++ )
- {
- free( s->base );
- s->base++;
- }
-
- s->base = s->top = NULL;
- s->stackSize = 0;
- return OK;
- }
- //计算栈的当前容量
- int StackLen(sqStack s)
- {
- return(s.top - s.base); // 初学者需要重点讲解
- }
- //若栈不空,则用e返回s的栈顶元素,并返回OK,否则返回ERROR
- Status GetTop(sqStack s, ElemType *e)
- {
- //若栈不空,则用e返回s的栈顶元素,并返回OK;否则返回ERROR
- if( s.base == s.top )
- return ERROR;
- *e = *(s.top-1);
- return OK;
- }
- int main(int argn, char* argv[], char* arge[])
- {
- ElemType c;
- sqStack s, temp;
- int len, i, sum = 0, j;
- int flag; //3次标识
- InitStack(&s);
- InitStack(&temp);
- printf("请输入二进制数,输入#符号表示结束\n"); //如输入 11001001#
- scanf("%c", &c);
- /*
- 请输入要查询的字母:0
- 你输入的字符 0 对应的十进制数为: 48 对应的十六进制数为:30
- 请输入要查询的字母:1
- 你输入的字符 1 对应的十进制数为: 49 对应的十六进制数为:31
- */
- while( c != '#')
- {
- Push(&s,c);
- scanf("%c", &c);
- }
- fflush(stdin); //把\n从缓冲区清除 getchar()也可以
- len = StackLen(s);
- printf("栈当前容量是: %d\n", len);
- flag = 0; // 标识置0
- for( i = 0,j = 0; i < len; i++ )
- {
- Pop(&s,&c);
- sum = sum + (c - 48)*pow(2,j);
- if(flag == 3 || i == (len-1)) //i == (len-1)是防止循环退出前把数据压栈
- {
- Push(&temp,sum);
- sum = 0; //清空
- flag = 0; // 标识置0
- j = 0; //次方数置0
- }else
- {
- flag++; //标识递增
- j++;
- }
-
- }
- printf("转化为十六进制数是:");
-
- len = StackLen(temp);
- for( i = 0; i < len; i++ )
- {
- Pop(&temp,&c);
- printf("%X", c);
- }
- //销毁栈
- // DestroyStack(&s);
- // DestroyStack(&temp);
- printf("\n");
- ///////////////////////////////////////////////
- system("pause");
- return 0;
- }
复制代码
二进制转换为八进制的代码只要将里面的标识flag改为: flag==2就可以了 |
|