PTA Xiaomingタイピング(10ポイント)(データ構造+二重リンクリスト)

7-1シャオミンタイピング(10ポイント)

Xiao Mingは、Microsoft Wordを使用してドキュメントを入力しています。ドキュメントには、azとスペースの小文字のみが含まれています。入力中に、ホームキー、終了キー、←矢印キー、→矢印キー、挿入キー、バックスペースを1つ以上押すことができます。倍。キー。キーボードでのシャオミンのキーストロークのシーケンスを考慮して、プログラムを作成し、シャオミンの画面に表示される最終的なテキストを出力してください。ヒント:Homeキーを押すと現在のカーソルがテキストの先頭に移動し、Endキーを押すと現在のカーソルがテキストの末尾に移動し、←キーと→キーを押すと現在のカーソルが左または右に1つ移動します(カーソルがドキュメントの先頭にある場合、左に移動することはできません。カーソルをドキュメントの最後で右に移動することはできません)、挿入キーはテキストの挿入と置換を切り替えます(デフォルトは挿入状態です)。 Backspaceキーは、現在のカーソルの前の文字を削除します。

入力フォーマット:

入力は50,000文字以下です。これは、XiaoMingのキーシーケンスを意味します。az小文字、スペース、および文字[、]、{、}、-、=が含まれます。文字「[」はホームキー、「]」は終了キー、「{」は←キー、「}」は→キー、「-」は挿入キー、「=」はバックスペースキーを表します。 。

出力フォーマット:

出力は、XiaoMingの画面に表示される最終的なテキストです。最後の文字の後にキャリッジリターンやラインフィードはありません。

サンプル

入力例1:

jilin[i lofe{
    
    {
    
    -v-} ] universiti=y

出力例1:

i love jilin university

入力例2:

abcd[c-de

出力例2:

cdecd

入力例3:

[[]][][]happy=birthday

出力サンプル3:

happbirthday

入力例4:

efg[bbb}}=}}}}=[{
    
    {
    
    {
    
    {
    
    a

出力サンプル4:

abbbe

制限

著者:Zhuyun Gang
ユニット:吉林大学
コードサイズ制限:16 KB
制限時間:25ミリ秒
メモリ制限:10 MB

問題解決

質問の制限時間は25ミリ秒です。データ構造の二重リンクリストを調査します。問題解決プロセス中の二重リンクリストの削除と挿入に注意してください(最初のリストの削除と挿入に特に注意してください)。そして、最後の位置)。
この質問は、リンクリストの先頭に挿入および削除を容易にするために、空のノードとリンクリストを使用しています。操作します

コード

#include <algorithm>  //7-1 小明打字 (10分)
#include <cstring>
#include <iostream>
using namespace std;

typedef struct LNode {
    
    
    char ch;
    LNode* next;
    LNode* prev;
} * List;

int main() {
    
    
    char ch;
    List start, end, tmp;  //带空头节点链表, 每次插入tmp后面
    List L = new LNode();
    start = L;
    end = L;
    tmp = L;

    bool isInsert = true;

    List ins;
    while (scanf("%c", &ch) && ch != '\n') {
    
    
        if (ch == '[') {
    
    
            tmp = start;
        } else if (ch == ']') {
    
    
            tmp = end;
        } else if (ch == '{') {
    
    
            if (tmp->prev) tmp = tmp->prev;
        } else if (ch == '}') {
    
    
            if (tmp->next) tmp = tmp->next;
        } else if (ch == '-') {
    
    
            isInsert = !isInsert;
        } else if (ch == '=') {
    
      //删除tmp
            if (tmp->prev) {
    
    
                List t = tmp;
                tmp->prev->next = tmp->next;
                if (tmp->next) {
    
    
                    tmp->next->prev = tmp->prev;
                    tmp = tmp->prev;
                } else {
    
    
                    tmp = tmp->prev;
                    tmp->next = NULL;
                }
                delete t;
                if (tmp->next == NULL) end = tmp;  //如果是删除最后的, 更新end
            }
        } else {
    
      // tmp后面添加
            ins = new LNode();
            ins->ch = ch;
            ins->next = tmp->next;
            ins->prev = tmp;
            tmp->next = ins;
            tmp = ins;
            if (tmp->next == NULL) end = tmp;  //如果插入在最后, 更新end
            if (!isInsert && tmp->next) {
    
      //如果是替换, 且tmp下一个存在, 再删除tmp下一个
                List t = tmp->next;
                if (t->next) {
    
    
                    tmp->next = t->next;
                    t->next->prev = tmp;
                    delete t;
                } else {
    
    	//删除元素在末尾
                    delete t;
                    end = tmp;  //更新end
                    tmp->next = NULL;
                }
            }
        }
        // end->next = NULL;	//保险, 但没必要
    }

    tmp = start->next;
    while (tmp) {
    
    
        printf("%c", tmp->ch);
        tmp = tmp->next;
    }
    // 注意清理内存, 这里节省运行时间不清理

    return 0;
}

おすすめ

転載: blog.csdn.net/qq_45349225/article/details/109633790
おすすめ