1 #include2 #include 3 #include 4 5 #define init_stack_szie 20 6 #define stack_increment 10 7 #define ok 1 8 #define error 0 9 10 typedef char elemtype; 11 typedef int status; 12 13 typedef struct suqstack{ 14 elemtype* base; 15 elemtype* top; 16 int stacksize; 17 }suqstack; 18 19 status initstack(suqstack *s){ 20 s->base = (elemtype*)malloc(sizeof(elemtype) * init_stack_szie); 21 if(!s->base) 22 return error; 23 s->top = s->base; 24 s->stacksize = init_stack_szie; 25 return ok; 26 } 27 status pop(suqstack *s,elemtype *result){ 28 if(s->base == s->top) 29 return error; 30 *result = *(--(s->top)); 31 return ok; 32 } 33 status push(suqstack *s,elemtype value){ 34 if(s->top - s->base == s->stacksize){ 35 s->base = (elemtype*)realloc(s->base,sizeof(elemtype) * (stack_increment init_stack_szie)); 36 if(!s->base) 37 return error; 38 s->top = s->base init_stack_szie; 39 s->stacksize = init_stack_szie stack_increment; 40 } 41 *(s->top) = value; 42 s->top ; 43 return ok; 44 } 45 int stacklength(suqstack s){ 46 return s.top - s.base; 47 } 48 status binary2decimal(){ 49 suqstack s; 50 initstack(&s); 51 elemtype c; 52 int i; 53 int sum = 0; 54 int len; 55 printf("please enter binary number end of '#': "); 56 scanf("%c",&c); 57 while(c != '#'){ 58 push(&s,c); 59 scanf("%c",&c); 60 } 61 getchar(); 62 len = stacklength(s); 63 for(i = 0; i < len; i ){ 64 pop(&s,&c); 65 sum = sum (c-48) * pow(2,i); 66 } 67 printf("result is %d(10)\n",sum); 68 return ok; 69 } 70 status binary2octal(){ 71 elemtype c; 72 suqstack s1; 73 suqstack s2; 74 initstack(&s1); 75 initstack(&s2); 76 int i,j,k,len,len1,sum; 77 printf("please enter binary number end of '#': "); 78 scanf("%c",&c); 79 while(c != '#'){ 80 push(&s1,c); 81 scanf("%c",&c); 82 } 83 getchar(); 84 len = stacklength(s1); 85 for(i = 0; i < len; i = i 3){ 86 sum = 0; 87 for(j = 0,k = i; j < 3 && k < len; j ,k ){ 88 pop(&s1,&c); 89 sum = sum (c-48) * pow(2,j); /* 1的ascii=49 90 0的ascii=48 91 */ 92 } 93 //printf("%c\n",sum 48); 94 push(&s2,sum 48); //sum 48为ascii码值 95 //栈中的元素的类型char 96 } 97 len1 = stacklength(s2); 98 printf("the result is "); 99 for(i = 0;i < len1; i ){ 100 pop(&s2,&c); 101 printf("%c",c); 102 } 103 printf("(8)\n"); 104 return ok; 105 } 106 status binary2hexadecimal(){ 107 elemtype c; 108 suqstack s1; 109 suqstack s2; 110 initstack(&s1); 111 initstack(&s2); 112 int i,j,k,len,sum,len1; 113 printf("please enter binary number end of '#': "); 114 scanf("%c",&c); 115 while(c != '#'){ 116 push(&s1,c); 117 scanf("%c",&c); 118 } 119 getchar(); 120 len = stacklength(s1); 121 for(i = 0; i < len; i = i 4){ 122 sum = 0; 123 for(j = 0,k = i; j < 4 && k < len; j , k ){ 124 pop(&s1,&c); 125 sum = sum (c - 48) * pow(2, j); 126 } 127 /* 0-------48 1-------49 128 * 2-------50 3-------51 129 * 4-------52 5-------53 130 * 6-------54 7-------55 131 * 8-------56 9-------57 132 * a-------65 b-------66 133 * c-------67 d-------68 134 * */ 135 if(sum < 10) 136 push(&s2,sum 48); 137 else 138 push(&s2,sum 55); 139 } 140 len1 = stacklength(s2); 141 for(i = 0; i < len1; i ){ 142 pop(&s2,&c); 143 printf("%c",c); 144 } 145 printf("\n"); 146 } 147 int main(){ 148 //binary2decimal(); 149 //binary2octal(); 150 binary2hexadecimal(); 151 return 0; 152 }