刚刚散步回来,闲来无事,无意间打开了PTA,忽然发现数据结构又布置新的作业了- -今天体育课太累,外加我又是个十足的懒狗,所以我就只把第一题写了,剩下的三道题之后再慢慢做~
话不多说,先放题:
7-1 回文判断
回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。编写一个程序,使用栈判定给定的字符序列是否为回文。
若用C++,可借助STL的容器实现。
输入格式:
输入待判断的字符序列,按回车键结束,字符序列长度<20。
输出格式:
若字符序列是回文,输出“YES”;否则,输出“NO”。
输入样例:
abdba
输出样例:
YES
先放代码再说明一下我的思路吧:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Stack<String> stack = new Stack<String>();
String str = scanner.next();
char[] chars = str.toCharArray();
int mid = 0;
if(chars.length % 2 != 0) {
mid = (chars.length - 1) / 2;
stack.push(String.valueOf(chars[0]));
for(int i = 1 ; i < chars.length ; i++){
stack.push(String.valueOf(chars[i]));
if(i == mid){
stack.pop();
}
String c1 = stack.pop();
String c2 = stack.pop();
if(!c1.equals(c2)){
stack.push(c2);
stack.push(c1);
}
}
if(stack.empty()){
System.out.println("YES");
}
else System.out.println("NO");
}
else {
stack.push(String.valueOf(chars[0]));
for (int i = 1; i < chars.length; i++) {
stack.push(String.valueOf(chars[i]));
String c1 = stack.pop();
String c2 = stack.pop();
if(!c1.equals(c2)){
stack.push(c2);
stack.push(c1);
}
}
if(stack.empty()){
System.out.println("YES");
}
else System.out.println("NO");
}
}
}
就是先建立一个栈,接着把输入的字符串分割成字符,再一个个储存在Char数组里;之后判断一下这个数组的长度,如果是奇数长度,则找出它的中间值,以后在栈里把这个中间值排掉再对栈里的元素进行比较;如果是偶数长度,则直接就开始比较。比较的方法也很简单:先在栈中压入第一个元素,之后用循环逐个压入元素,然后用pop()函数取出元素并比较,如果元素相同则释放掉,不然的话就留下。在循环结束后,用判空函数empty()判断栈是不是为空,空的话就是回文串(即YES),反正就不是(即NO)。
这是运行的结果: