繁体   English   中英

C++ 反转字符串但先打印数字

[英]C++ reverse a string but printing numbers first

我在课堂上得到了一个项目,几乎完成了,我需要取一串数字和字母并返回该字符串,首先打印数字,然后按相反顺序打印字母(例如 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() 但是当我得到奇怪的刻字时那个会发生。

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

//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;
}

这是我的看法。 它只循环一次字符串。 我没有你的类型,所以我只是使用标准版本。

std::string output;
output.reserve( myString.size() );

std::stack<char> stack;
for ( char c : myString ) {
   if ( std::isdigit( c ) )   // if it's a number, just add it to the output
       output.push_back( c );
   else  // otherwise, add the character to the stack
       stack.push( c );
}

// string is done being processed, so use the stack to get the
// other characters in reverse order
while ( !stack.empty() ) { 
    output.push_back( stack.top() );
    stack.pop();
}

std::cout << output;

工作示例: https : //godbolt.org/z/eMazcGsMf

注意:从您的描述中不确定如何处理字母和数字以外的字符,因此将它们与字母一样对待。

一种方法如下:

版本 1

#include <iostream>
#include <string>

int main() {
 std::string s = "abc123";
    
    std::string output;
    output.resize(s.size());
    
   int i = output.length() - 1;
    int j = 0;
    
    for(char &c: s)
    {
        if(!std::isdigit(c))
           {
            
            output.at(i) = c;
            
            --i;
           }
        else
        {
           
           
            output.at(j) = c;
            ++j;
        }
    }
    
    std::cout<<output<<std::endl;
    
    
}

您还可以在上述程序中使用迭代器来获得所需的结果,如版本 2所示。

版本 2

#include <iostream>
#include <string>

int main() {
 std::string s = "abfsc13423";
    
    std::string output;
    output.resize(s.size());
    
   
    std::string::reverse_iterator iter = output.rbegin();
    std::string::iterator begin = output.begin();
   
    
    for(char &c: s)
    {
        if(!std::isdigit(c))
           {
            
            *iter = c;
            
            
            ++iter;
            
           }
        else
        {
            
            *begin = c;
            
             ++begin;
           
        }
    }
    
    std::cout<<output<<std::endl;
    
    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM