[英]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.