C++单次遍历字符串实现数字在前、字母倒序输出问题求助
C++单次遍历实现数字在前、字母倒序拼接方案
现有代码核心问题
- 字母处理逻辑未正确利用栈「先进后出」的倒序特性:你当前在遍历阶段每压入一个字母就立刻弹出拼接,栈内始终只有1个元素,输出的字母自然和原顺序一致
- 你尝试的
curchar += myStack.Peek()逻辑错误:curchar是单字符类型,+=会对两个字符的ASCII码做数值加法,结果自然是乱码,该思路不可用
调整方案
遍历阶段仅做数据存储操作,遍历结束后再统一读取队列和栈的内容,全程仅对原字符串遍历1次,符合作业要求:
- 遍历原字符串时,数字入队列、字母入栈,不需要中途拼接结果
- 遍历完成后,先依次取出队列中所有元素,得到顺序不变的数字串
- 再依次弹出栈中所有元素,得到倒序的字母串
- 拼接两部分即为最终结果
修正后代码
#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
相关产品推荐
相关产品推荐

