看了一下网上的关于回文的程序,大多是递归或是用指针来实现的,我换了一个思路, 用栈和队列来实现一下. ;) 可能有些复杂,但是可读性比较好. /* some useful functions and variables. */ #ifndef _UTILITY_H_ #define _UTILITY_H_ #include <iostream> using namespace std; typedef char ElemType; typedef struct Node{ ElemType data; struct Node* pNext; }Node; #endif // _UTILITY_H_ /* stack class declarations. */ #ifndef _STACK_H_ #define _STACK_H_ #include "utility.h" class CStack{ public: CStack(); bool push(ElemType elem); bool pop( ElemType& elem); ~CStack(); private: Node* top; // stack top node Node* base; // stack base node }; #endif // _STACK_H_ /* queue class declarations. */ #ifndef _QUEUE_H_ #define _QUEUE_H_ #include "utility.h" class CQueue{ public: CQueue(); bool EnQueue(ElemType elem); bool DeQueue(ElemType& elem); ~CQueue(); private: Node* rear; // only allow insert operation Node* front; // only allow delete operation }; #endif // _QUEUE_H_ /* */ #include "stack.h" /* Parameter : none Return : none Description : default constructor. */ CStack::CStack() { base = new Node; top = base; base->pNext = NULL; } // default constructor /* Parameter : ElemType Return : true or false Description : insert an element to the stack top. */ bool CStack::push(ElemType elem) { Node* pNode = new Node; pNode->data = elem; pNode->pNext = top; top = pNode; return true; } // push /* Parameter : ElemType& Return : true or false Description : delete an element on the stack top. */ bool CStack::pop(ElemType& elem) { if (top != base) { elem = top->data; top = top->pNext; } return true; } // pop /* Parameter : none Return : none Description : default destructor. */ CStack::~CStack() { } // default destructor /* */ #include "queue.h" /* Parameter : none Return : none Description : class default constructor. */ CQueue::CQueue() { front = new Node; rear = front; rear->pNext = NULL; } // default constructor /* Parameter : ElemType Return : true or false Description : enter the queue. */ bool CQueue::EnQueue(ElemType elem) { Node* pNode = new Node; pNode->data = elem; pNode->pNext = NULL; rear->pNext = pNode; rear = pNode; return true; } // EnQueue /* Parameter : ElemType& Return : true or false Description : quit the queue. */ bool CQueue::DeQueue(ElemType& elem) { Node* pNode; if (front == rear) { return false; } pNode = front->pNext; elem = pNode->data; front->pNext = pNode->pNext; if (pNode == rear) { rear = front; } return true; } // DeQueue /* Parameter : none Return : none Description : class default destructor. */ CQueue::~CQueue() { while(front) { rear = front->pNext; delete front; front = rear; } } // default destructor //----------------------------------------------------------------------------- // Copyright (c) 2010 eryar All rights reserved. // // File : main.cpp // Author : eryar@163.com // Date : 2010-01-30 // Version : 1.0v // // Description : The most familiar palindromes, in English at least, // are character-by-character: the written characters // read the same backwards as forwards. // //============================================================================= #include "stack.h" #include "queue.h" bool Palindrome(char* words, int iLen); int main(int argc, char* argv[]) { int i = 0; bool bFlag = true; char elem; char szBuffer[100]; cout<<"Input a string of character: "<<endl; while(bFlag) { cin>>elem; if (elem == '@') { bFlag = false; break; } if (i > 100) { cout<<"character lengthen large than 100!"<<endl; bFlag = false; } szBuffer[i] = elem; ++i; } // if (Palindrome(szBuffer, i)) { cout<<"Yes! string is palindrome."<<endl; } else { cout<<"No! string is not palindrome."<<endl; } return 0; } /* Parameter : char* Return : if is palindrome return true, else false. Description : the writen characters read the same backwards as forwards. */ bool Palindrome(char* words, int iLen) { ElemType forward; ElemType backward; CQueue queue; CStack stack; for (int i = 0; i < iLen; ++i) { queue.EnQueue(words[i]); stack.push(words[i]); } for (i = 0; i < iLen; ++i) { queue.DeQueue(forward); stack.pop(backward); cout<<"forward : "<<forward<<endl; cout<<"backward: "<<backward<<endl; if (forward != backward) { return false; } } return true; } // Palindrome