1. 程式人生 > >【c++】說反話加強版【存疑】

【c++】說反話加強版【存疑】

  給定一句英語,要求你編寫程式,將句中所有單詞的順序顛倒輸出。

輸入格式:

  測試輸入包含一個測試用例,在一行內給出總長度不超過500 000的字串。字串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字串,單詞之間用若干個空格分開。

輸出格式:

  每個測試用例的輸出佔一行,輸出倒序後的句子,並且保證單詞間只有1個空格。

輸入樣例:

Hello World   Here I Come

輸出樣例:

Come I Here World Hello

解決思路:

  1. 建立兩個棧a和b,從輸入流中讀入1個字元,如果不為空格,則將其壓入棧a;

  2. 如果讀入的字元不為空格

    2.1 則判斷棧a是否為空,如果棧a不為空,則將棧a的元素依次全部出棧,然後壓入棧b。棧a為空,什麼也不做

    2.2 判斷棧b是否為空,棧b不為空,則從棧b中出棧一個元素,判斷該元素是否為空格,如果該元素為空格,則重新將其壓入棧中。如果該元素不為空格,則重新將該元素入棧,同時壓入一個空格。
    2.3如果棧b為空,則直接壓入一個空格。

  3. 讀入下一個字元,重複過程1,2,直到遇到’\n’;

  4. 判斷棧a是否為空,不為空,則將a中的元素全部壓入b.

  5. 將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; }

這段程式碼通過了一個測試用例,其他的顯示格式錯誤或者段錯誤,原因還沒找到,存疑。
這裡寫圖片描述