打算学完编译原理后再次实现它。。。
以下为比较“杂乱”的方法:
海量数据: https://pan.baidu.com/s/1Prd0ZqNLoCLLvXyJjCef3w
如果大家有发现这个程序的问题,请联系我,谢谢啦~~~ 我很疑惑,不知道错在哪里,难受。。。
1 /*把黏在一起的代码以某种格式进行编排 2 编排方式:https://pintia.cn/problem-sets/994805046380707840/problems/994805047169236992 3 */ 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7 #include <stdbool.h> 8 #define maxlen 1000000 9 10 char str[maxlen],s[maxlen]; 11 long len,i,j,w=0,g; 12 long sum_lock=0,lock[maxlen],sum_lockif=0,lockif[maxlen]; 13 bool vis=false; 14 char c=' ',vis_kuo; //' ' 15 16 ///删除多余的空格 17 void DelSpace() 18 { 19 while (str[i]==' ') //delete ' ' 20 i++; 21 } 22 23 ///'{'及换行操作 24 void EndOfLeft() 25 { 26 DelSpace(); 27 if (str[i]=='{') 28 { 29 i++; 30 DelSpace(); 31 ///锁定,之后的位置(行首空格)大于等于lock[sum_lock] 32 sum_lock++; 33 lock[sum_lock]=w+1; 34 } 35 printf("{ "); 36 w++; 37 for (j=0;j<2*w;j++) 38 // printf(" "); 39 printf("%c",c); 40 } 41 42 ///_(condition)_ 43 void Parenthese() 44 { 45 DelSpace(); 46 // printf(" "); 47 printf("%c",c); 48 ///c语言中语句有括号,这是定义,即if () while ();而pascal等语言可以没有 49 vis=false; g=0; 50 while (!(vis && g==0)) //not exit initially 51 { 52 printf("%c",str[i]); 53 if (str[i]=='(') 54 { 55 vis=true; 56 g++; 57 } 58 else if (str[i]==')') //the number of ')' is the same as '(' 59 g--; 60 i++; 61 } 62 // printf(" "); 63 printf("%c",c); 64 EndOfLeft(); 65 } 66 67 ///遇到else的操作:上一个if的位置决定空格的情况 68 void elseOp() 69 { 70 while (w>lockif[sum_lockif]-1) //-1 71 { 72 printf(" "); 73 w--; 74 for (j=0;j<2*w;j++) 75 // printf(" "); 76 printf("%c",c); 77 printf("}"); 78 } 79 sum_lockif--; 80 printf(" "); 81 for (j=0;j<2*w;j++) 82 // printf(" "); 83 printf("%c",c); 84 // printf("else "); //add a ' ' 85 printf("else%c",c); 86 i+=4; 87 EndOfLeft(); 88 } 89 90 ///'}'及换行操作 91 void EndOfRight() 92 { 93 ///先把已有的'}'输出 94 while (1) 95 { 96 DelSpace(); 97 if (str[i]!='}') 98 break; 99 i++; 100 printf(" "); 101 if (vis_kuo) 102 vis_kuo=false; 103 else 104 w--; 105 for (j=0;j<2*w;j++) 106 // printf(" "); 107 printf("%c",c); 108 printf("}"); 109 sum_lock--; //解除锁定 110 } 111 112 ///若接下来的几个字符为"else",不按lock的情况输出 113 strncpy(s,str+i,4); 114 s[4]='