首页 > 解决方案 > C ++反转字符串但首先打印数字

问题描述

我在课堂上得到了一个项目并且几乎完成了,我需要获取一串数字和字母并返回该字符串,其中首先打印数字,然后以相反的顺序打印字母(例如 abc123 应该返回 123cba)。到目前为止,我的代码首先返回一个字符串,其中包含数字和字母的原始顺序(例如 abc123 返回 123abc)。我可以用两个循环来做到这一点,但是分配要求我的代码只遍历初始字符串一次。这是我到目前为止的代码......

#include <iostream>
#include <string>
#include "QueType.h"
#include "StackType.h"
using namespace std;

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


for (int i = 0; i < myString.length(); i++) {
    if (isdigit(myString.at(i))) {
        myQueue.Enqueue(myString.at(i));
        myQueue.Dequeue(curchar);
        numbers += curchar;
        //cout<<numbers<<endl;
    }
    else if (islower(myString.at(i))) {
        myStack.Push(myString.at(i));
        curchar = myStack.Peek();
        myStack.Pop();
        letters += curchar;
        //cout<<curchar<<endl;
    }
    
}

cout<<(myString = numbers + letters)<<endl;

}

在我的代码中,我有两个 .h 文件,它们设置了一个堆栈和一个队列。使用给定的字符串,代码在字符串中循环查看是否看到字母或数字。然后将字符串中的位置用数字保存到队列中,用字母将其保存到堆栈中。

我能想到颠倒字母顺序的唯一另一种方法是在 if else 语句中,而不是在每个循环中都有 char = myStack.Peek() ,将其更改为 char += myStack.Peek() 但是当我得到奇怪的字母时那个会发生。

标签: c++loopsqueuestackreverse

解决方案


因为你已经得到了带有字母的字符串,你基本上可以将它反转,就是这样。

//emplace version:
void reverse_str(std::string& in)
{
    std::reverse(in.begin(), in.end());
}

//copy version
std::string reverse_str(std::string in)
{
    std::reverse(in.begin(), in.end());
    return in;
}

在您的情况下, emplace 版本将是最佳匹配。在其他情况下(例如,当您想保留原始字符串时)首选副本版本。


添加一个示例以使其尽可能干净。

int main()
{
    std::string inputstr = "123abc";
    std::string numbers{};
    std::string letters{};
    
    
    for(auto c : inputstr)
    {
        if(isdigit(c))
            numbers += c;
        else
            letters += c;
    }
    
    reverse_str(letters); //using the emplace version
    std::cout << numbers + letters;
}

推荐阅读