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 int 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: /*入栈操作,将e压入栈中*/
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: /*出栈操作,用e将栈顶元素返回*/
41: void Pop(sqStack *s , ElemType *e) {
42: if(s->top == s->base) return;
43:
44: *e = *--(s->top);
45: }
46:
47: int f(int n)
48: {
49: int r = 1, e;
50: sqStack stack;
51: initStack(&stack); /*初始化栈*/
52:
53: while(n != 0) {
54: Push(&stack, n); /*保存现场n*/
55: n = n / 2;
56: }
57:
58: while(stack.top != stack.base)
59: {
60: Pop(&stack, &e);
61: r = r * e;
62: }
63:
64: return r;
65: }
66:
67: int main()
68: {
69: printf("The result for conversion of recursion to non recursion is\n");
70: printf("f(5)=%d \n", f(5));
71: return 0;
72: }