myeln

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.【运行结果】

 

分类:

技术点:

相关文章:

  • 2021-12-02
  • 2021-10-26
  • 2021-12-02
  • 2021-07-17
  • 2021-11-04
  • 2021-06-12
  • 2021-10-21
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-06-26
  • 2021-11-29
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案