每日一面—— 反转字符串

 编程实现字符串中各单词的翻转

1 #include <iostream>
2 using namespace std;
3
4 void RevStr(char *src)
5 {
6  char *start = src, *end = src, *ptr = src;
7
8  while(*ptr++ != '\0');
9  end = ptr-2;       //找到字符串末尾
10  while(start < end)
11  {
12   swap(*start++, *end--);   //逆置整个字符串
13  }
14
15  start = src, end = ptr-2;
16  ptr = start;
17  while(*ptr++ != '\0')
18  {
19   if(*ptr == ' ' || *ptr == '\0') //找到单词
20   {
21     end = ptr - 1;    //end指向单词末尾
22     while(start < end)
23     swap(*start++, *end--);  //逆置单词
24
25     start = end = ptr+1;  //指向下一个单词开头
26   }
27  }
28 }
29
30 int main()
31 {
32  char src[] = "I am from Shanghai";
33  cout << src << "\n";
34  RevStr(src);
35  cout << src << "\n";
36
37  return 0;
38 }

反转字符串,但其指定的子串不反转

1 #include <iostream>
2 #include <cassert>
3 #include <stack>
4 using namespace std;
5
6 const char* reverse(const char* s1, const char* token)
7 {
8   stack<char> stack1;
9   const char* ptoken = token, *head = s1, *rear = s1;
10  assert(s1 && token);
11  while (*head != '\0')
12  {
13    while(*head != '\0' && *ptoken == *head)
14    {
15     ptoken++;
16     head++;
17    }
18    if(*ptoken == '\0')
19    {
20     const char* p;
21     for(p=head-1; p>=rear; p--)
22     {
23       stack1.push(*p);
24     }
25     ptoken = token;
26     rear = head;
27    }
28    else
29    {
30     stack1.push(*rear++);
31     head = rear;
32     ptoken = token;
33    }
34  }
35  char *pReturn = new char[strlen(s1)+1];
36  int i=0;
37  while(!stack1.empty())
38  {
39    pReturn[i++] = stack1.top();
40    stack1.pop();
41  }
42  pReturn[i]='\0';
43
44  return pReturn;
45 }
46
47 int main(int argc, char* argv[])
48 {
49  char welcome[] = "Welcome you, my friend";
50  char token[] = "you";
52
51  const char *pRev = reverse(welcome, token);
53  cout << "before reverse:" << endl;
54  cout << welcome << endl;
55  cout << "after reverse:" << endl;
56  cout << pRev << endl;
57
58  return 0;
59 }

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值