DS堆栈--行编辑 C++

2023-07-30 11:29:37 浏览数 (1)

温馨提示:本题为深大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;
	}
}

0 人点赞