基于栈的回文字符序列判断
描述
回文序列是正反读均相同的字符序列,如“abba”和“abdba”均是回文,但是“good”不是回文。请设计一个算法判定给定的字符序列是否为回文。
输入
多组数据,每组数据有一行。每一行为一个长度不定的字符序列A。当A为“0”时,输入结束。
输出
对于每组数据输出一行。若字符序列A是回文序列,则输出“YES”,否则输出“NO”。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#define Msize 1000
typedef struct {
char *base; //栈底
char *top;//栈顶
int size; //栈的最大容量
}Stack;
//栈的初始化 (top:指向栈顶的后一个)
void Initstack(Stack &mystack) {
mystack.base = new char[100];//分配空间大小
mystack.top = mystack.base;//初始为空栈
mystack.size = Msize;//栈最大容量
}
//入栈
void push(Stack &mystack, char& e) { //插入新元素e
if (mystack.top - mystack.base == mystack.size) {
cout << "栈满" << endl;
}
*(mystack.top++) = e; //把e压入栈顶 栈顶指针+1
}
//出栈
void pop(Stack &mystack) {
if (mystack.top == mystack.base) {
cout << "栈空" << endl;
}
mystack.top--;
}
//栈顶元素
char top(Stack &mystack) {
if (mystack.top == mystack.base) {
cout << "栈空 无法取值" << endl;
}
return *(mystack.top-1); //输出栈顶元素的值
}
int main() {
char s[100]; //字符数组
while (cin>>s) {
if (s[0]=='0') break; //退出条件 ***
Stack mystack;
Initstack(mystack);
for (int i = 0; s[i]!='\0'; i++) { //入栈
push(mystack, s[i]);
}
bool flag = 1; //标记
for (int i = 0; s[i] != '\0'; i++) {
if (s[i] == top(mystack)) {
pop(mystack);
}
else {
pop(mystack);
flag = 0;
}
}
if (flag == 1) cout << "YES" << endl;
else cout << "NO" << endl;
}
}