You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++单次遍历字符串实现数字在前、字母倒序输出问题求助

C++单次遍历实现数字在前、字母倒序拼接方案

现有代码核心问题

  • 字母处理逻辑未正确利用栈「先进后出」的倒序特性:你当前在遍历阶段每压入一个字母就立刻弹出拼接,栈内始终只有1个元素,输出的字母自然和原顺序一致
  • 你尝试的curchar += myStack.Peek()逻辑错误:curchar是单字符类型,+=会对两个字符的ASCII码做数值加法,结果自然是乱码,该思路不可用

调整方案

遍历阶段仅做数据存储操作,遍历结束后再统一读取队列和栈的内容,全程仅对原字符串遍历1次,符合作业要求:

  1. 遍历原字符串时,数字入队列、字母入栈,不需要中途拼接结果
  2. 遍历完成后,先依次取出队列中所有元素,得到顺序不变的数字串
  3. 再依次弹出栈中所有元素,得到倒序的字母串
  4. 拼接两部分即为最终结果

修正后代码

#include <iostream>
#include <string>
#include <cctype> // 补充标准库头文件,确保isdigit、isalpha可用
#include "QueType.h"
#include "StackType.h"
using namespace std;

int main ()
{
    QueType<char> myQueue;
    StackType<char> myStack;
    string myString = "hello there123";
    char curchar;
    string result;

    // 单次遍历原字符串,仅做入队、入栈操作
    for (int i = 0; i < myString.length(); i++) {
        if (isdigit(myString.at(i))) {
            myQueue.Enqueue(myString.at(i));
        }
        // 如果仅需要匹配小写字母,可改回islower
        else if (isalpha(myString.at(i))) {
            myStack.Push(myString.at(i));
        }
    }

    // 拼接顺序数字部分
    while (!myQueue.IsEmpty()) {
        myQueue.Dequeue(curchar);
        result += curchar;
    }

    // 拼接倒序字母部分
    while (!myStack.IsEmpty()) {
        curchar = myStack.Peek();
        myStack.Pop();
        result += curchar;
    }

    cout << result << endl;
    return 0;
}

验证效果

输入abc123时:

  • 队列存储1、2、3,出队顺序为123
  • 栈存储a、b、c,出栈顺序为cba
  • 最终输出123cba,符合需求

内容的提问来源于stack exchange,提问作者Devin Bowen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:45:03