L3-019 代码排版 (30 分)-PAT 团体程序设计天梯赛 GPLT

某编程大赛中设计有一个挑战环节,选手可以查看其他选手的代码,发现错误后,提交一组测试数据将对手挑落马下。为了减小被挑战的几率,有些选手会故意将代码写得很难看懂,比如把所有回车去掉,提交所有内容都在一行的程序,令挑战者望而生畏。

为了对付这种选手,现请你编写一个代码排版程序,将写成一行的程序重新排版。当然要写一个完美的排版程序可太难了,这里只简单地要求处理C语言里的for、while、if-else这三种特殊结构,而将其他所有句子都当成顺序执行的语句处理。输出的要求如下:

  • 默认程序起始没有缩进;每一级缩进是 2 个空格;
  • 每行开头除了规定的缩进空格外,不输出多余的空格;
  • 顺序执行的程序体是以分号“;”结尾的,遇到分号就换行;
  • 在一对大括号“{”和“}”中的程序体输出时,两端的大括号单独占一行,内部程序体每行加一级缩进,即:
 
  • for的格式为:
 
  • while的格式为:
 
  • if-else的格式为:

输入格式:

输入在一行中给出不超过 331 个字符的非空字符串,以回车结束。题目保证输入的是一个语法正确、可以正常编译运行的 main 函数模块。

输出格式:

按题面要求的格式,输出排版后的程序。

输入样例:

输出样例:

 
分析:point表示当前处理的文本位置,space储存但前需要在行首加多少空格,mark表示自动补充的大括号数量,use表示是否开启了大括号自动补充。在Function函数内,集成了’跳过无效空格’、’空格输出’、’关键字匹配’以及’补充的打括号补全’功能,很好用。刚开始我们需要将int main ()部分单独输出,因为该部分可能存在不可移出的空格。然后对于剩下的主体部分,主要分成三个模块处理——’大括号匹配整理’、’关键字匹配整理’以及’其余代码匹配整理’。特别注意在有些关键字后面添加了代码没有自带大括号,需要自己去补全并记录相关数量信息。在space为0时结束程序,剩下的就是简单的模拟即可~ 

❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼

❤ 点击这里 -> 订阅《从放弃C语言到使用C++刷算法的简明教程》by 柳婼

❤ 点击这里 -> 订阅PAT甲级乙级、蓝桥杯、GPLT天梯赛、LeetCode题解离线版