【c++】說反話加強版【存疑】
阿新 • • 發佈:2019-02-14
給定一句英語,要求你編寫程式,將句中所有單詞的順序顛倒輸出。
輸入格式:
測試輸入包含一個測試用例,在一行內給出總長度不超過500 000的字串。字串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字串,單詞之間用若干個空格分開。
輸出格式:
每個測試用例的輸出佔一行,輸出倒序後的句子,並且保證單詞間只有1個空格。
輸入樣例:
Hello World Here I Come
輸出樣例:
Come I Here World Hello
解決思路:
建立兩個棧a和b,從輸入流中讀入1個字元,如果不為空格,則將其壓入棧a;
如果讀入的字元不為空格
2.1 則判斷棧a是否為空,如果棧a不為空,則將棧a的元素依次全部出棧,然後壓入棧b。棧a為空,什麼也不做
2.2 判斷棧b是否為空,棧b不為空,則從棧b中出棧一個元素,判斷該元素是否為空格,如果該元素為空格,則重新將其壓入棧中。如果該元素不為空格,則重新將該元素入棧,同時壓入一個空格。
2.3如果棧b為空,則直接壓入一個空格。讀入下一個字元,重複過程1,2,直到遇到’\n’;
判斷棧a是否為空,不為空,則將a中的元素全部壓入b.
將b中的元素列印輸出。
程式程式碼:
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 500
struct stack
{
char data[MAX];
char* top;
};
void initStack(stack &a);
char pushStack(stack &a);
void popStack(stack &a, char c);
int isStackEmpty(const stack &a);
int main()
{
stack a ;
stack b;
initStack(a);
initStack(b);
char temp;
char c;
scanf("%c",&c);
while(c!='\n')
{
if(c!=' ')
popStack(a,c);
else
{
while(!isStackEmpty(a))
{
temp = pushStack(a);
popStack(b,temp);
}
/*if(isStackEmpty(a))
popStack(a,c);*/
if(!isStackEmpty(b))
{
temp = pushStack(b);
if(temp==' ')
popStack(b,temp);
else
{
popStack(b,temp);
popStack(b,' ');
}
}
else
popStack(b,' ');
}
scanf("%c",&c);
}
while(!isStackEmpty(a))
{
temp =pushStack(a);
popStack(b,temp);
}
while(!isStackEmpty(b))
{
temp =pushStack(b);
cout<<temp;
}
return 0;
}
void initStack(stack &a)
{
a.top =a.data;
}
void popStack(stack &a, char c)
{
a.top+=1;
*a.top=c;
}
char pushStack(stack &a)
{
char temp = *a.top;
a.top-=1;
return temp;
}
int isStackEmpty(const stack &a)
{
if(a.top==a.data)
return 1;
else
return 0;
}
這段程式碼通過了一個測試用例,其他的顯示格式錯誤或者段錯誤,原因還沒找到,存疑。