刷题打卡第四天——单词的撤销与恢复

332 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述:

撤销/恢复操作具有广泛的用途,比如word文档中输入一个单词,可以点撤销,然后可以再恢复。 编程实现如下功能: 从标准输入读取到一个字符串,字符串可包含0个或多个单词,单词以空格或者tab分隔; 如果遇到 "undo" 字符串,表示"撤销"操作,前一个字符串被撤销掉; 如果遇到"redo"字符串,表示恢复刚才撤销掉的字符串. 例如: 输入字符串 "hello undo redo world.", 对字符串中的 undo 和 redo 处理后, 最终输出的结果为 "hello world."

输入描述:

一行字符串: 包含0个或多个单词,单词以空格或者tab分隔

输出描述:

一行字符串: 由0个或多个单词组成,单词以空格分隔

输入例子1:

hello undo redo world.

输出例子1:

hello world.

二、思路分析:

这道题我首先想到的是使用临时变量把撤销的单词存起来,然后恢复的时候再拿回来就可以了,但仔细一想,如果有多次撤销操作呢。

于是我想到使用两个栈,如果是单词就往栈1里面push,当遇到undo命令时就将栈顶单词取出放到栈2中去,遇到redo命令时就从栈2中取栈顶push到栈1中去,相当于恢复。

最后清空栈2,再将栈1元素取出push到栈2中,后进先出,就可以输出正确顺序的单词了。

其中要注意的就是如果执行undo后如果再新增了单词,那么redo就无法执行了,要清空栈2.

三、AC 代码:

import java.util.Scanner;
import java.util.Stack;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String[] sarr = str.split(" ");
        Stack<String> stack = new Stack<>();
        Stack<String> tempStack = new Stack<>();

        for(String s:sarr){
            if(s.equals("undo")){
                if(!stack.isEmpty()){
                    tempStack.push(stack.pop());
                }
            }else if(s.equals("redo") && !tempStack.isEmpty()){
                stack.push(tempStack.pop());
            }else{
                stack.push(s);
                tempStack.clear();
            }
        }
        tempStack.clear();
        while(!stack.isEmpty()){
            tempStack.push(stack.pop());
        }
        while(!tempStack.isEmpty()){
            System.out.print(tempStack.pop()+" ");
        }

    }
}

总结

本题利用栈的后进先出,实现了字符的撤销、恢复,但是不知道这题的具体要求是啥,能不能在新增单词后恢复被撤销的单词不确定,所以我提交的时候5组用例过了2组,也没法查看用例,难受,但是大概思路应该是不会错,如果你有更好的解法欢迎评论区留言讨论。