UVa 11988 Broken Keyboard (a.k.a. Beiju Text)

本文介绍了一个字符串处理问题——BrokenKeyboard(又称BeijuText),通过使用链表实现输入光标的动态移动,解决了当遇到特定字符时如何高效更新显示字符串的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Broken Keyboard (a.k.a. Beiju Text)

Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown

UVa 11988


https://uva.onlinejudge.org/i...

Accepted Code

// Author : Weihao Long
// Created : 2018/01/10

#include "stdio.h"
#include "stdlib.h"

#define MAX 100007

struct LNode {
    char data;
    struct LNode *next;
};

void Destroy_List(LNode *head);

char str[MAX];

int main() {
    LNode *head, *tail, *pnew, *pnow;
    head = (LNode *)malloc(sizeof(LNode));
    pnow = tail = head;
    tail->next = NULL;
    while (gets(str) != NULL) {
        for (int i = 0; str[i] != '\0'; i++) {
            if (str[i] == '[') {
                pnow = head;
            }
            else if (str[i] == ']') {
                pnow = tail;
            }
            else {
                pnew = (LNode *)malloc(sizeof(LNode));
                pnew->data = str[i];
                pnew->next = pnow->next;
                pnow->next = pnew;
                if (pnow == tail) {
                    tail = pnew;
                }
                pnow = pnew;
            }
        }
        for (LNode *p = head->next; p != NULL; p = p->next) {
            printf("%c", p->data);
        }
        putchar('\n');
        Destroy_List(head);
        head = (LNode *)malloc(sizeof(LNode));
        pnow = tail = head;
        tail->next = NULL;
    }
    return 0;
}

void Destroy_List(LNode *head) {
    LNode *p;
    while (head->next != NULL) {
        p = head->next;
        head->next = head->next->next;
        free(p);
    }
    free(head);
}

Notes

题意:
输入一个字符串,遇到 '[' 则将输入光标移到最前面,遇到 ']' 则将输入光标移到最后面,问屏幕上最终得到的字符串是什么样子。

分析:
用数组的话移动元素的开销太大,用链表做即可。
相较常规的链表,这里多设一个 pnow 指针,视作输入光标,总是指向下一个元素插入的位置,以减少查找光标的时间开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值