实验内容

 

[问题描述]

    试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列。其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。

[基本要求]

    对于键盘输入的任意一个字符串,将其进行逆置,判断原串和逆置的串是否完全一致,完全一致则为回文,因此分别利用队列的先进先出(FIFO)和栈的后进先出(FILO)实现,算法只能使用一个栈和一个队列以及若干简单类型变量,算法时间复杂度应为O(n)

【代码】

 

 
  
  1. #include<iostream>  
  2. #include<stack>  
  3. #include<queue>  
  4. using namespace std;  
  5. bool palindrome();  
  6. int main()  
  7. {  
  8.     cout<<"请输入字符串(以@结束,中间部分以&分开)"<<endl;  
  9.     if(palindrome()==true)  
  10.     {  
  11.         cout<<"是回文。";  
  12.     }  
  13.     else 
  14.     {  
  15.         cout<<"不是回文。";  
  16.     }  
  17.     system("pause");  
  18. }  
  19. bool palindrome()  
  20. {  
  21.     stack<char> s;  
  22.     queue<char> q;  
  23.     char str;  
  24.     while((str=getchar())!='@')  
  25.     {  
  26.         q.push(str);  
  27.         s.push(str);  
  28.     }  
  29.     if(s.size()%2==0)  
  30.     {  
  31.         return false;  
  32.     }  
  33.     else 
  34.     {  
  35.     while(!s.empty() && !q.empty())  
  36.     if(s.top()!=q.front())  
  37.         return false;  
  38.     else 
  39.         return true;  
  40.     }  
  41. }  

【运行结果】

 

注:以上内容仅供参考,如有问题欢迎指正