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

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

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