JAVA语言实现使用栈进行回文串的匹配

参考《啊哈!算法》一书,P34页程序。

  • 栈:先进后出(压弹)
    一个变量:栈顶变量top
    对栈顶进行删除和添加

  • 题目:回文字符串的判断
    要求1): 使用栈的思想做;
    要求2): 是回文串输出true,不是输出false;

完整代码如下:

import java.util.Scanner;
public class Stack {
	char [] ch;
	public Stack(){
		ch = new char [0];
	}
	
	//压栈     -添加元素
	public void push(char c ){
		char [] newCh = new char[ch.length+1];
		for (int i = 0; i < ch.length; i++) {
			newCh[i]= ch[i];
		}
		newCh[ch.length] = c;
		ch = newCh;
	}	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String string = scanner.next();
		Stack  stack = new Stack();
		for (int i = 0; i < string.length(); i++) {
			stack.push(string.charAt(i));
		}
// 定义一个新的字符数组,用来存储回文串中前部分元素		
		char [] ch1 = new char[stack.ch.length];
 		// 字符串的中点
 		int mid = stack.ch.length/2-1;
		// 栈进行初始化
 		int top = 0;
 		int next;
 		
 		for(int i =0 ;i <= mid;i++){
 			ch1[++top] =  stack.ch[i];
 		}
		
		if(stack.ch.length % 2==0){
			next = mid + 1;
		}else {
			next = mid + 2;;
		}
		
		//进行匹配
		for(int i = next; i < stack.ch.length;i++){
			if(stack.ch[i] != ch1[top])
				break;
			top--;
		}
		
		if(top==0){
			System.out.println("true");
		}else {
			System.out.println("false");
		}
		
	}
}

参考博客:栈进行回文串的匹配
改进上述代码:
将弹出栈的元素与栈中前部分元素进行匹配

import java.util.Scanner;
public class Stack1 {
	char [] ch;
	public Stack1(){
		ch = new char [0];
	}
	
	//压栈     -添加元素
	public void push(char c ){
		char [] newCh = new char[ch.length+1];
		for (int i = 0; i < ch.length; i++) {
			newCh[i]= ch[i];
		}
		newCh[ch.length] = c;
		ch = newCh;
	}
	
	//弹栈,获取栈顶元素
	public char pop(){
		if(ch.length==0){
			throw new RuntimeException("Stack is Empty");
		}
		char element = ch[ch.length-1];
		char [] newCh = new char[ch.length-1];
		for (int i = 0; i < newCh.length; i++) {
			newCh[i] = ch[i];
		}		
		ch = newCh;
		return element;
	}
		
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String string = scanner.next();
		Stack1  stack = new Stack1();
		for (int i = 0; i < string.length(); i++) {
			stack.push(string.charAt(i));
		}
		// 将弹出栈的元素与栈中前部分元素进行匹配
		int flag = 0;
		for(int i =0 ;i < stack.ch.length; i++){
			// 每次获取栈顶元素
			char member = stack.pop();
			if(member != stack.ch[i]){
				flag = -1;
				break;
			}else flag = 1;
		}
		
		if(flag == 1){
			System.out.println("true");
		}else {
			System.out.println("false");
		}					
	}	
}

输出结果样例:
键盘输入

aqwsxzaqwsza

输出结果:

false

键盘输入

asdffdsa

输出结果:

true
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值