1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "math.h"
4
5 typedef struct demo
6 {
7 int* base;
8 int* top;
9 int stacksize;
10 }sqstack;
11
12 /* 创建一个栈 */
13 int stackInit(sqstack* S,int n)
14 {
15 S->base = (int*)malloc(sizeof(int)*n);
16 if(!S->base)
17 {
18 printf("stack is null!");
19 return 0;
20 }
21 S->top = S->base;
22 S->stacksize = n;
23 return 1;
24 }
25
26 /* 清空一个栈 */
27 void clearStack(sqstack* S)
28 {
29 S->top = S->base;
30 }
31
32 /* 销毁一个栈 */
33 void destroyStack(sqstack* S)
34 {
35 free(S->base);
36 S->base = S->top = NULL;
37 S->stacksize = 0;
38 }
39
40 /* 入栈 */
41 #define STACKINSERSIZE 10
42 int Push(sqstack* S,int data)
43 {
44 if(S->top - S->base >= S->stacksize)
45 {
46 S->base = (int*)realloc(S->base,(S->stacksize+STACKINSERSIZE)*sizeof(int));
47 if(!S->base) return 0;
48 S->top = S->base + S->stacksize;
49 S->stacksize = S->stacksize + STACKINSERSIZE;
50 }
51 *(S->top) = data;
52 S->top++;
53
54 return 1;
55 }
56
57 /* 出栈 */
58 int Pop(sqstack* S,int* data)
59 {
60 if(S->top == S->base) return 0;
61 S->top--;
62 *data = *(S->top);
63 }
64
65 int stackLen(sqstack S)
66 {
67 return (S.top-S.base);
68 }
69 int main()
70 {
71 sqstack stack1;
72 int i,len,sum = 0;
73 int c;
74 stackInit(&stack1,20);
75 clearStack(&stack1);
76
77 printf("please inpot 0 or 1\n");
78 // scanf("%c",&c);
79 /* 输入0 or 1字符表示二进制,以 # 结束,例如:1111# */
80 while((c = getchar()) != '#')
81 {
82 /* 入栈 */
83 Push(&stack1,c);
84 // scanf("%c",&c);
85 }
86 getchar();
87 len = stackLen(stack1);
88 printf("\nlen = %d\n",len);
89 for(i = 0;i < len;i++)
90 {
91 /* 出栈 */
92 Pop(&stack1,&c);
93 /* 计算将二进制转换成10进制 */
94 sum = sum + ((c - '0') * (pow(2,i)));
95 }
96 printf("decimal is %d\n",sum);
97 destroyStack(&stack1);
98 getchar();
99 return 0;
100 }