单词反转实现(使用栈内存)

如题,代码如下:

 

 

void reverse_words(std::string& original)
{
    int n = original.size();
    char* p = &original.front(); // scan ptr

    static const int NBUF = 8;
    char buf[NBUF];

    // truncate back whitespace

    int offset = 0;
    for(; offset < n;) {
        // reverse scan until ' ';

        auto wspos = original.find_last_of(' ');
        if (wspos != std::string::npos) {
            // move word to front
            // move the whole buffer to 
            char* frag = &original[wspos + 1];
            int frag_len = original.size() - wspos - 1;
            int frag_avails = frag_len; // "fds fd";
            while (frag_avails > 0 && offset < n) {
                // cache words to buf
                int nstored = std::min(NBUF, frag_avails); // 7
                int frag_offset = 0;
                if (frag_avails > NBUF)
                    frag_offset = std::max(0, std::abs(frag_avails - NBUF));
                else
                    frag_offset = frag_len - frag_avails;

                memcpy(buf, frag + frag_offset, nstored);
                frag_avails -= nstored; 

                // move whole buf to for take place
                memmove(p + nstored + offset, p + offset, n - nstored - offset);
                memcpy(p + offset, buf, nstored);
                // offset += nstored;
            }
            offset += frag_len;

            if (offset < n) {
                // move all witespace // efb abc 
                auto nextwords = original.find_last_not_of(' ');
                if (nextwords != std::string::npos) {
                    int nws = n - nextwords - 1; // numbers of wihtespace
                    if (nws > 0) {
                        memmove(p + nws + offset, p + offset, n - nws - offset);
                        memset(p + offset, ' ', nws);
                        offset += nws;
                    }
                }
            }
        }
        else { // on word, do nothing
            break;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值