撤销与恢复---niuke

链接:https://www.nowcoder.com/questionTerminal/46badc29891b4294a3b9cc235a96631a?orderByHotValue=1&page=1
来源:牛客网

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

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

输出描述:
一行字符串: 由0个或多个单词组成,单词以空格分隔
示例1
输入
hello undo redo world.
输出
hello world.

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        List<String> li = new LinkedList(Arrays.asList(sc.nextLine().split(" ")));
        //新建一个列表以空格分割字符串
        Deque<String> dq = new LinkedList<String>();
        //模拟栈
        for(int i = 0;i<li.size();i++){
            if(li.get(i).equals("undo")&&i!=0) {
                dq.push(li.get(i-1));
                //把undo前一个字符串入栈,相当于备份
                li.remove(i);
                //移除undo
                li.remove(i-1);
                //移除undo前一个字符串
                i-=2;
                continue;
            }
            if(li.get(i).equals("redo")) {
                if(!dq.isEmpty()) {
                    li.remove(i);
                    //移除redo字符串
                    li.add(i,dq.pop());
                    //出栈到li列表,恢复删除操作
                }
            }
        }
        System.out.println(String.join(" ", li));
        //把空格当作元素之间链接符号
        sc.close();
    }
}
posted @ 2022-03-19 16:19  网抑云黑胶SVIP用户  阅读(206)  评论(0编辑  收藏  举报