1: #include <stdio.h>
2: #include <math.h>
3: #include <stdlib.h>
4: #define STACK_INIT_SIZE 20
5: #define STACKINCREMENT 10
6:
7: typedef char ElemType;
8: typedef struct {
9: ElemType *base;
10: ElemType *top;
11: int stacksize;
12: } sqStack;
13:
14: void initStack(sqStack *s)
15: {
16: /*内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/
17: s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
18:
19: if(!s->base) exit(0); /*分配空间失败*/
20:
21: s->top = s->base; /*最开始,栈顶就是栈底*/
22: s->stacksize = STACK_INIT_SIZE; /*最大容量为STACK_INIT_SIZE */
23: }
24:
25: void Push(sqStack *s, ElemType e) {
26: if(s->top - s->base >= s->stacksize) {
27: /*栈满,追加空间*/
28: s->base = (ElemType *)realloc(s->base, (s->stacksize +
29: STACKINCREMENT) * sizeof(ElemType));
30:
31: if(!s->base) exit(0); /*存储分配失败*/
32:
33: s->top = s->base + s->stacksize;
34: s->stacksize = s->stacksize + STACKINCREMENT; /*设置栈的最大容量*/
35: }
36:
37: *(s->top) = e; /*放入数据*/
38: s->top++;
39: }
40:
41: void Pop(sqStack *s , ElemType *e) {
42: if(s->top == s->base) return;
43:
44: *e = *--(s->top);
45: }
46:
47: int StackLen(sqStack s) {
48: return (s.top - s.base) ;
49: }
50:
51: int main()
52: {
53: ElemType c;
54: sqStack s1;
55: sqStack s2;
56: int len, i, j, sum = 0;
57: initStack(&s1); /*创建一个栈s1,用来存放二进制字符串*/
58:
59: printf("Please input a binary number and type '#' for end\n");
60: /*输入0/1字符表示的二进制数,以#结束*/
61: scanf("%c", &c);
62:
63: while(c != '#')
64: {
65: if(c == '0' || c == '1')
66: Push(&s1, c);
67:
68: scanf("%c", &c);
69: }
70:
71: initStack(&s2); /*创建一个栈s2,用来存放八进制字符串*/
72: len = StackLen(s1); /*得到栈中的元素个数,即二进制数的长度*/
73:
74: for(i = 0; i < len; i = i + 3) {
75: for(j = 0; j < 3; j++) {
76: Pop(&s1, &c); /*取出栈顶元素*/
77: sum = sum + (c - 48) * pow(2, j); /*转换为八进制数*/
78:
79: if(s1.base == s1.top) break;
80: }
81:
82: Push(&s2, sum + 48) ; /*将八进制数以字符形式压入栈中*/
83: sum = 0;
84:
85: }
86:
87: printf("The Octal from is \n") ;
88:
89: while(s2.base != s2.top ) { /*输出八进制栈的内容*/
90: Pop(&s2, &c);
91: printf("%c", c);
92: }
93: }