1.【问题】
程序员输入程序出现差错时,可以采取以下的补救措施:按错了一个键时,可以补按一个退格符“#”,以表示前一个字符无效;发现当前一行有错,可以按一个退行符“@”,以表示“@”与前一个换行符之间的字符全部无效。
【输入格式】
输入一行字符,个数不超过 100
【输出格式】
输出一行字符,表示实际有效字符
【输入样例】
sdfosif@for (ii#=1,#;i<.#=8;i+++#);
【输出样例】
for (i=1;i<=8;i++);
2.【问题分析】
通过栈的操作,模拟这一过程:
1、逐行处理,处理完一行后输出结果、栈重新置空。
2、对于每行,逐个字符处理:
①既不是退格符“#”,也不是退行符“@”,则将该字符压栈;
②是退格符“#”,则出栈;③是退行符“@”,就把栈置空。
3.1【程序及备注】-栈实现
#include<iostream> #include<stack> using namespace std; int main(){ stack<char>s1;//定义存放字符栈(取出反序) stack<char>s2;//定义存放字符栈(正序输出) string str; while(getline(cin,str)){//getline输入一行包括空格(可以字符数组,字符串) for(int i=0;i<str.size();i++){ switch(str[i]){ case \'#\': s1.pop(); break;//遇到 # 弹出前面一个字符 case \'@\': while(!s1.empty()) s1.pop(); break;//遇到 @ 清空栈 default: s1.push(str[i]);//正常字符放入栈中 } } while(!s1.empty()){//由于栈是后进先出,需要借助另外一个栈接收 s2.push(s1.top()); s1.pop(); } while(!s2.empty()){//正常输出 cout<<s2.top(); s2.pop(); } cout<< endl; } }
3.2【程序及备注】-数组模拟栈实现
#include<iostream> using namespace std; int main(){ char s[150];//字符数组存储处理后的数据 int top=0;//记录输入道s数组下标 string str; while(getline(cin,str)){//getline输入一行包括空格(可以字符数组,字符串) for(int i=0;i<str.size();i++){ switch(str[i]){ case \'#\': top--; break;//遇到 # top下标向前移动 1 case \'@\': top=0; break;//遇到 # top下标初始 0,重新接收输入 default: top++; s[top] = str[i];//正常放入字符到数组s中 } } for(int i=1;i<=top;i++) {//循环输出处理后数组s cout << s[i]; } cout<< endl; } }
4.【运行结果】