問題 C: 【數據結構:堆棧】判斷回文數
時間限制: 1 Sec 內存限制: 64 MB提交: 8 解決: 5
[提交][狀態][討論版]
題目描述
進入上古文明遺跡的第二個陷阱是產生的密鑰有可能是一個回文數,如果用戶不小心輸入這個回文數,就會引發危險,所以你需要判斷一個數是否是回文數。
要求:由於輸入的一個回文數可能無窮大,所以用單鏈表存儲該數,將用戶輸入的數以一個單鏈表的方式存儲,從頭掃描該單鏈表,將前面的一半元素入棧,若元素總個數為奇數,則跳過中間的那個元素,然后開始循環:邊退棧邊在單鏈表中后移指針,若當前棧頂元素與單鏈表中當前節點的值域不相等,則退出循環。最后如果棧空且鏈表比較完畢,則是回文數,否則不是回文數。
要求:由於輸入的一個回文數可能無窮大,所以用單鏈表存儲該數,將用戶輸入的數以一個單鏈表的方式存儲,從頭掃描該單鏈表,將前面的一半元素入棧,若元素總個數為奇數,則跳過中間的那個元素,然后開始循環:邊退棧邊在單鏈表中后移指針,若當前棧頂元素與單鏈表中當前節點的值域不相等,則退出循環。最后如果棧空且鏈表比較完畢,則是回文數,否則不是回文數。
輸入
為一個字符串(長度小於100000),即需判斷的數。
輸出
如果是回文數,輸出1;否則輸出0。
樣例輸入
111122221111
樣例輸出
1
代碼:
#include <iostream> #include <cstdio> #include <cstring> #include <stack> using namespace std; char a[100005]; int main() { int len; stack<char> s1; int half; int b; while(scanf("%s",a)!=EOF){ len=strlen(a); half=len/2; b=0; if(len%2==0){ for(int i=0;i<half;i++){ s1.push(a[i]); } for(int i=half;i<len;i++){ char t=s1.top(); s1.pop(); if(t!=a[i]){ printf("0\n"); b=1; break; } } if(b!=1){ printf("1\n"); } } if(len%2==1){ for(int i=0;i<half;i++){ s1.push(a[i]); } for(int i=half+1;i<len;i++){ char t=s1.top(); s1.pop(); if(t!=a[i]){ printf("0\n"); b=1; break; } } if(b!=1){ printf("1\n"); } } } return 0; }
