C語言強化(九)翻轉句子中單詞的順序
來源:程序員人生 發布時間:2015-05-28 08:38:44 閱讀次數:4952次
這是到很常見的題目,非常簡單,但你用到數據結構了嗎,或說你用對了嗎?
通過這道題,你可以掌握:
- 如何將用戶的輸入,輸出到控制臺
- 如何分割字符串
- 如何正確使用數據結構
題目:輸入1個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。
句子中單詞以空格符隔開。標點符號和普通字母1樣處理。
例如輸入“I am a student.”,則輸出“student. a am I”。
思路
1、獲得字符串
首先要能夠獲得到用戶輸入的1串字符串,有兩點需要注意:
1.如果使用cin<<,輸出時會發現空格以后的字符串不被輸出,以下圖

解決方法:使用cin.getline(str,length)
2.由于用戶輸入的字符串長度1般不會和我們創造的字符數組長度1樣,所以如果采取傳統的i<str.size()去遍歷,會發現輸出很多個“燙”,由于數組沒有初始化
以下圖

解決方法:使用strlen(str)獲得字符數組有效長度。
下面是用戶輸入輸出的代碼
<span style="font-size:14px;"> char str[100];
//輸入提示
cout<<"請輸入,長度少于100"<<endl;
//用戶輸入
cin.getline(str,100);
cout<<"所輸入的字符串長度為:";
//輸出長度
cout<<strlen(str)<<endl;
//輸出內容
for(int i=0;i<strlen(str);i++){
cout<<str[i];
}
cout<<endl;</span>
2、翻轉
實現了輸入輸出后,就是關鍵的翻轉字符串了。
怎樣進行翻轉?利用字符數組的角標變換???拜托,這不是當初我們剛剛學習C語言時采取的方法嗎,而對學過數據結構的人來講,第1反應想到的是這么個寶貝――棧!
先進后出,這是棧的特性!這在前面C語言強化(2)設計可以求最小元素的棧講過。
把先輸入的字符串放進棧中,最后出來的順序不就翻轉了嗎?
所以我們要做的就是把字符串分割成1個個子串,然后塞進去棧中,再取出來,弄定!
翻轉函數代碼
<span style="font-size:14px;">void reverseStr(char * str){
//截取,使用棧結構實現翻轉輸出
char * p;
vector<char*> vt;
const char * split = " ";
p = strtok (str,split);
while(p!=NULL) {
//cout<<p;
vt.push_back(p);//塞進去棧中
p = strtok(NULL,split); //繼續分割字符串
}
//利用棧結構的特性,從上往下遍歷
while(vt.size()>0){
cout<<vt[vt.size()⑴]<<" ";
vt.pop_back();
}
cout<<endl;
}</span>
完全源代碼
<span style="font-size:14px;">#include <stdio.h>
#include<stdlib.h>
#include <iostream>
#include<sstream>
#include <vector>
using namespace std;
/**
翻轉句子中單詞的順序。
題目:輸入1個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。
句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母1樣處理。
例如輸入“I am a student.”,則輸出“student. a am I”。
思路
1.用戶輸入1串字符串,把它輸出來
2.截取,使用棧結構實現翻轉輸出
*/
void reverseStr(char * str){
//截取,使用棧結構實現翻轉輸出
char * p;
vector<char*> vt;
const char * split = " ";
p = strtok (str,split);
while(p!=NULL) {
//cout<<p;
vt.push_back(p);//塞進去棧中
p = strtok(NULL,split); //繼續分割字符串
}
//利用棧結構的特性,從上往下遍歷
while(vt.size()>0){
cout<<vt[vt.size()⑴]<<" ";
vt.pop_back();
}
cout<<endl;
}
void main()
{
/*
輸入輸出
*/
char str[100];
//輸入提示
cout<<"請輸入,長度少于100"<<endl;
//用戶輸入
//cin>>str;//不可以這樣!
cin.getline(str,100);
cout<<"所輸入的字符串長度為:";
//輸出長度
cout<<strlen(str)<<endl;
//輸出內容
//cout<<str<<endl;
/*
//不能這樣輸出!
for(int i=0;i<100;i++){
cout<<str[i];
}
*/
for(int i=0;i<strlen(str);i++){
cout<<str[i];
}
cout<<endl;
reverseStr(str);
system("pause");
}</span>
之所以要學習數據結構,就是由于很多現實問題都是滿足數據結構模型的。比如此題的【翻轉――棧】
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈