温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长。
题目描述
使用C 的STL堆栈对象,编写程序实现行编辑功能。行编辑功能是:当输入#字符,则执行退格操作;如果无字符可退就不操作,不会报错
本程序默认不会显示#字符,所以连续输入多个#表示连续执行多次退格操作
每输入一行字符打回车则表示字符串结束
注意:必须使用堆栈实现,而且结果必须是正序输出
输入
第一行输入一个整数t,表示有t行字符串要输入 第二行起输入一行字符串,共输入t行
输出
每行输出最终处理后的结果,如果一行输入的字符串经过处理后没有字符输出,则直接输出NULL
输入样例1
4 chinaa# sb#zb#u ##shen###zhen### chi##a#####
输出样例1
china szu sz NULL
输入样例2
1 ###############################################################################################
输出样例2
NULL
思路分析
简单讲讲思路:
首先是创建一个char型的栈和一个string类型的字符串,每次读取字符串之后呢就用for范围循环把字符串里面的字符依次压入栈,注意到需要在压栈的时候进行条件判断,如果不是#就压入栈,如果是#号并且栈非空就弹栈,因为有可能一开始就退格,所以需要判断在栈非空的情况下弹栈。
接下来是正序输出的问题,完全可以再创建一个栈变量,然后把它装进去,再遍历输出来完事,我这里直接使用之前的字符串实现,先把字符串清空,然后遍历栈,将栈顶元素插入字符串的首位,这样就倒序了。
AC代码
代码语言:javascript复制#include<bits/stdc .h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
stack<char>test;
string temp;
cin >> temp;
for (auto&it : temp) {
if (it != '#')
test.push(it);
else if (!test.empty())
test.pop();
}
temp.clear();
if (test.empty())
cout << "NULL" << endl;
else
while (!test.empty()) {
temp.insert(temp.begin(),test.top());
test.pop();
}
cout<<temp << endl;
}
}