我在課堂上得到了一個專案,幾乎完成了,我需要取一串數字和字母并回傳該字串,首先列印數字,然后按相反順序列印字母(例如 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() 但是當我得到奇怪的刻字時那個會發生。
uj5u.com熱心網友回復:
因為你已經得到了帶有字母的字串,所以你基本上可以反轉它,就是這樣。
//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;
}
uj5u.com熱心網友回復:
這是我的看法。它只回圈一次字串。我沒有你的型別,所以我只是使用標準版本。
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
注意:從您的描述中不確定如何處理字母和數字以外的字符,因此將它們與字母一樣對待。
uj5u.com熱心網友回復:
一種方法如下:
版本 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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315519.html
上一篇:使用字典創建凱撒密碼,只輸出一項
下一篇:@在回圈陣列中的用途?
