几道笔试题的解法(四)

本文介绍了一种将单词逆序输出的算法,并提供了两种实现方式:一种是使用C语言指针操作实现,另一种是借助栈的数据结构实现。通过具体代码示例展示了如何逐个单词地逆序输出字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:  编写一个单词逆序输出的算法。例如:“I am a student, 要求输出为:”student a am I

分析:本题考查的是C语言的指针

 

代码如下:

第一种:     //C语言知识实现

void ReverseWord(char* str, char* outstr)

{

  char* head = str;

 

  while(*str++);   

 

  int count = 0;

 

  for ( str -= 2; *str; str-- )

  {

     if (str == head)

     {

         do

         {

            *outstr++ = *str++;

         }while(count--);

 

         break;

     }

     if ( *str == ' ')

     {

         char *temp = str + 1;

         while(count--)

            *outstr++ = *temp++;

         *outstr++ = ' ';

         count = 0;

     }

     else

      {

         count++;

     }

  }

  *outstr = 0;

}

第二种: //直接通过创建栈来实现

#include <cassert>

#include <iostream>

#include <ostream>

 

using namespace std;

 

template<class T>

class stackNode

{

public:

  T data;

  stackNode<T> *Next; 

};

 

template<class T>

class Stack_Node

{

public:

  Stack_Node() : first(0)

  {     

  }

  virtual ~Stack_Node()

  {

     stackNode<T> *p;

     while (first)

     {

         p = first->Next;

         delete first;

         first = p;       

     }

  }

  bool IsEmpty() const

  {

     return first == 0;

  }

  bool IsFull() const

  {

     try

     {

         stackNode<T> *p = new stackNode<T>;

         delete p;

         return false;

     }

     catch (...)

     {

         return true;

     }

  }

  T GetTop() const

  {

     if (IsEmpty())

     {

         throw out_of_range("The stack is empty");

     }

     return first->data;     

  }

  Stack_Node<T>& Push(const T& x)

  {

     stackNode<T> *p = new stackNode<T>;   

     p->data = x;

     p->Next = first;

     first = p;   

 

     return *this;

  }

 

  Stack_Node<T>& Pop(T& x)

  {

     if (IsEmpty())

     {         

         throw out_of_range("The stack is empty");

     }

     x = first->data;

     stackNode<T> *p = first;

 

     first = first->Next;

     delete p;

     return *this;

  }

 

  int Length() const

  {

     int len = 0; 

     stackNode<T> *p = first;

     while (p)

     {

         len++;

         p = p->Next;

     }

     return len;

  }

 

  void Print(ostream& os) const

  {

     stackNode<T> *p = first;

     if (IsEmpty())

     {

         throw out_of_range("The stack is empty");

     }

     while (p)

     {

         os << p->data << " ";

         p = p->Next;

     }

  }

private:

  stackNode<T> *first;

};

 

template<class T>

ostream& operator<<(ostream& os, const Stack_Node<T>& x)

{

  x.Print(os);

  return os;

}

 

int GetLength(const char* _in)

{

  int _length = 0;

  while (*_in++ != '/0')

  {

     _length++;

  }

 

  return _length;

}

 

int GetSpecialCharCount(const char* _source, const char ch)

{

  int _count = 0;

 

  while (*_source++ != '/0')

  {

     if (*_source == ch)

     {

         _count++;

     }

  }

 

  return _count;

}

 

int FindChar(const char* _source, const char ch, int _position = 0)

{

  int ret = 0;

  assert(_position >= 0 && _position <= GetLength(_source));

 

  while (_source[_position] != '/0')

  {

     if (_source[_position] == ch)

     {

         ret = _position + 1;

         break;

     }

     _position++;

  }

 

  return ret;

}

 

char* CutString(const char* _source, int len, int _position = 0)

{

  assert(_position >= 0 && _position <= GetLength(_source));

  assert(len >= 0 && len <= GetLength(_source));

 

  char* retStr = new char[len + 1];

  memset(retStr, 0, len + 1);

  int i = 0;

 

  for (; i < len; ++i)

  {

     retStr[i] = _source[_position];

     _position++;

  }

 

  *(retStr + len) = '/0';

 

  return retStr;   

}

 

char* DelString(char* _source, int len)

{

  assert(len >= 0 && len <= GetLength(_source));  

  return (_source + len);

}

 

int main(void)

{

  Stack_Node<char*> s;

 

  char *str = "I am a student";

  char *temp = NULL;

  int index = 0;   

  int _count = GetSpecialCharCount(str, ' ');

 

  for (int i = 0; i <= _count ; ++i)

  {

     index = FindChar(str, ' ');

     temp = CutString(str, index);

     if (i == _count)

     {

         temp = str;

     }

     s.Push(temp);

     str = DelString(str, index);   

  }

 

  cout << s << '/n';  

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值