1 #include<iostream> 2 #include<cstdlib> 3 using namespace std; 4 5 //順序棧定義 6 #define OK 1 7 #define ERROR 0 8 #define OVERFLOW -2 9 #define MAXSIZE 100 10 typedef int Status; 11 typedef char SElemType; 12 typedef struct 13 { 14 SElemType *base; 15 SElemType *top; 16 int stacksize; 17 } SqStack; 18 19 //算法:順序棧的初始化 20 Status InitStack(SqStack &S) 21 { 22 // 構造一個空的順序棧 S 23 S.base = new SElemType[MAXSIZE]; //將base指向新申請的棧數組中 24 if(!S.base) exit(OVERFLOW); //申請失敗,則異常退出 25 S.top = S.base; //將棧底指針賦給棧頂指針,表示空棧 26 S.stacksize = MAXSIZE; //棧能容納的最大容量 27 return OK; //申請成功 28 } 29 //算法:順序棧的入棧 30 Status Push(SqStack &S, SElemType &e) 31 { 32 if(S.top-S.base==S.stacksize) //若是棧滿 33 return ERROR; 34 // 插入元素e爲新的棧頂元素 35 *S.top++ = e; //先將元素壓棧,棧頂指針指向下一個地址 36 return OK; //入棧成功 37 } 38 //算法:順序棧的出棧 39 Status Pop(SqStack &S, SElemType &e) 40 { 41 // 若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK;不然返回ERROR 42 if (S.base==S.top) //表示空棧 43 return ERROR; //返回錯誤 44 e = *--S.top; //先將棧頂指針減1,再取棧頂元素 45 return OK; //出棧成功 46 } 47 //算法:判斷是否爲迴文 48 int HuiWen(SElemType *ch, int length) //ch接收回文字符串數組的基地址,length接收回文字符串長度 49 { 50 SqStack S; 51 SElemType x; 52 int i,j, m = length/2; 53 InitStack(S); //初始化棧S 54 for(i=0;i<m;++i) //先將字符數組前一半的元素壓入棧中 55 Push(S,ch[i]); 56 for(j=length-m;j<length;j++){ //從一半後開始,會跳過奇數個數最中間那個數的比較 57 if(Pop(S,x) && x!=ch[j])break; //若是出棧成功 且出棧元素不和當前字符對應,則跳出 58 } 59 if(j!=length)return ERROR; //若是j不等於length 說明不是迴文,返回0 60 return OK; //不然返回1 61 } 62 63 int main() 64 { 65 cout << "\n********************判斷是否爲迴文************************\n\n"; 66 int i, length, flag = 1; 67 while (flag) 68 { 69 cout << "請輸入一個數,表明迴文字符串的長度:"; 70 cin >> length; //length存放回文字符串長度 71 cout << "請輸入" << length << "個字符:"; 72 SElemType *ch = new SElemType[2 * MAXSIZE]; //ch存放回文字符串數組的基地址 73 for (i = 0; i < length; i++) 74 cin >> ch[i]; //給數組ch 輸入用以判斷的字符串 75 cout << "您要判斷的字符串是:"; 76 for (i = 0; i < length; i++) 77 cout << ch[i]; //顯示數組ch 中的字符串 78 if (HuiWen(ch, length)) 79 cout << ",此字符串是迴文!\n\n" ; //HuiWen()是判斷迴文的函數,是迴文返回1 ,不是迴文返回0 80 else 81 cout << ",此字符串不是迴文!\n\n" ; 82 cout << "繼續判斷,輸入1,不然輸入0:"; 83 cin >> flag; 84 } 85 return 0; 86 }