1.4-8判断回文


解题思路:
方法一:利用栈先进后出的性质,先原元字符串压入栈中,然后依次出栈,和原字符串所有字符进行比较
方法二:在方法一的基础上,只把原字符串数组后半部分压入栈中,然后和数组前半部分进行对比,如果全部相等,就证明是回文序列,否则,就不是回文序列


#include <iostream> 
#include<cstring>
#include<stack>
using namespace std; 

char arr[1024];
int n; 
int fast = 0;  // 定义快指针 每次走两步
int slow = 0;  // 定义慢指针 每次走一步 当快指针走到数组末尾时,慢指针停留在数组中间 
stack <char> st; // 定义栈 
 
class operate{
public:
	void  location(){  // 生成快慢指针 
		while(fast + 2 < n){
			fast += 2;
			slow += 1;
		}
	} 

public: 
	void pus(){  // 将数组后半部分的字符串压入栈
		for(int i = slow + 1; i < n;i ++){
			st.push(arr[i]);
		}
	}

public:
	bool judge(){  // 字符串前半部分数字正序和栈中的后半部分逆序完全一样,就说明是回文结构
		if(slow == n/2) {  // 如果n是奇数 
			for(int i = 0;i < slow;i ++){
				if(arr[i] != st.top()) 
					return false; 
				else
				st.pop(); 
			} 
			return true; 
		} else{
			for(int i = 0;i <= slow;i ++){  // 如果n是偶数
				if(arr[i] != st.top()) 
					return false; 
				else
				st.pop(); 
			} 
			return true; 
		} 
	} 

} ; 


int main()
{
	cout<<"请输入回文字符串的长度:";
	cin >> n;

	cout<<"请输入回文字符串:";
	cin >> arr;

	cout<<"请输入回文字符串是:";
	cout << arr<< endl; 

	operate  op;
	op.location();
	op.pus(); 
	if(op.judge())
		cout << "YES" << endl;
	else
		cout << "NO" << endl; 
		
return 0; 
}

你可能感兴趣的:(算法设计与分析)