迴文字串(堆疊演算法)
阿新 • • 發佈:2018-12-04
題目描述
給出一個長度不超過1000的字串,判斷它是不是迴文(順讀,逆讀均相同)的。
輸入描述:
輸入包括一行字串,其長度不超過1000。
輸出描述:
可能有多組測試資料,對於每組資料,如果是迴文字串則輸出"Yes!”,否則輸出"No!"。
輸入示例
hellolleh helloworld
輸出示例
Yes! No!
C語言用堆疊來求迴文字串的程式碼如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100 typedef struct { char a[MAXSIZE]; int top; } SeqStack; SeqStack *Init_stack() { //置空棧 SeqStack *s; s=(SeqStack*)malloc(sizeof(SeqStack)); //申請棧的空間 s->top=-1; //初始化棧頂指標 return s; } int Empty_Stack(SeqStack *s) { //判斷是否為空棧 if(s->top==-1) return 1; else return 0; } int Push_Stack(SeqStack *s,char x) { //入棧 if(s->top==MAXSIZE-1) return 0; //棧滿不能入棧 else { s->top++; s->a[s->top]=x; return 1; } } int Pop_Stack(SeqStack *s,char *x) { //出棧 if(Empty_Stack(s)) return 0; //棧空不能出棧 else { *x=s->a[s->top]; //更新棧頂指標 s->top--; return 1; //棧頂元素存入*x,返回 } } int Top_Stack(SeqStack *s,char *x) { //取棧頂元素 if(Empty_Stack(s)) return 0; //棧空無元素 else { *x=s->a[s->top]; return 1; } } int main() { char a[100]; gets(a); int len=strlen(a); SeqStack *s; s = Init_stack(); char *ch; int flag=1; //flag用來判斷是否為迴文字元 for(int i=0; i<len/2; i++) { Push_Stack(s,a[i]); //把前一半的元素入棧 } for(int i=(int)(len/2.0+0.5); i<len; i++) { if(Pop_Stack(s,ch)) { if(*ch!=a[i]) { flag = 0; //不是迴文字元 } } } if(flag==1) printf("Yes!"); else printf("No!"); }
C++用堆疊的話可以直接呼叫<stack>這個庫
#include <bits/stdc++.h> #include <stack> using namespace std; int main() { string s; getline(cin,s); int len = s.length(); stack<char> T; bool flag = true; //flag用來判斷是否為迴文字元 for(int i=0; i<len/2; i++) { T.push(s[i]); //把前一半的元素入棧 } for(int i=(int)(len/2.0+0.5); i<len; i++) { if(!T.empty()) { if(T.top()!=s[i]) //判斷是否與棧頂元素相等 { flag = false; //不是迴文字元 } T.pop(); //刪除棧頂元素 } } if(flag) { cout << "Yes!" << endl; } else { cout << "No!" << endl; } }