mmxingye

导航

01 | c语言非递归乘法表(帧栈理解)

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdbool.h>
 4 
 5 typedef  struct{
 6     int pc;            //程序运行到了那一步
 7     int line;        //
 8 }Frame;
 9 
10 Frame stk[128];                //全局的栈
11 Frame *top = stk - 1;        //全局的栈指针
12 
13 void call(int line) {
14     //static int num = 1;
15 //     (*(++top)).pc = 0; 出现bug的地方,就在于++用的多了
16 //     (*(++top)).line = line;
17 //     (*(++top)).flag = flag;
18 
19     *(++top) = (Frame){ 0,line };    //学习这个指针一开始指在-1的位置,之后变为0,注意结构体的构造
20 }
21 
22 void ret() {
23     top--;
24 }
25 
26 void pp(int line) {
27     
28     call(line);                //注意这里是第一个桢,接下来就要靠它来生成其他的帧栈
29     for (Frame *f; (f = top) >= stk; f->pc++) {
30         if (f->pc+1 == f->line) {
31             for (int i = 1; i <= f->line; i++) {
32                 printf("%-2d* %-2d= %2d  ", i, f->line, i*f->line);            
33             }
34             printf("\n");
35             ret();                        //帧栈清理,事实是栈指针移动
36         }
37         //当相差为2的时候,这个时候才产生下一帧栈,若大于2的时候,为空语句,pc单纯增加
38         else if(f->pc+2==f->line){        
39             call(f->line - 1);
40         }    
41     }
42 }
43 int main() {
44     pp(10);
45     system("pause");
46 }

 

posted on 2022-03-27 11:33  独立树  阅读(29)  评论(0编辑  收藏  举报