数据结构实习作业--使用栈进行回文分析英文文章

题目

分析英文文章
功能:
某些英文单词是回文单词,现要求借助于栈的基本操作统计出某一篇英文文章中出现的所有回文单词及该文所有的单词的数量,并计算该文章的“回文单词比率”,其中回文单词比率的定义如下。

要求:
(1)英文文章用txt文件存储。
(2)使用栈的基本操作处理该英文文章。
(3)在屏幕上直接输出该文章中所有单词的总数量及回文单词的数量,并输出回文单词比率。
提示:
(1)英文文章中各单词是以空格作为分隔符的,在处理时编写代码将英文文章中英文单词以外的字符除去,包括标点符号。
(2)提取出英文单词后对其进行回文判断前,需将其所有字母均转换为小写的,原因是:如“Dad”其实是回文单词,但若不将其第一个字母“D”转换为小写字母“d”,则程序将会判断“Dad”不是回文单词。

成品展示

但是有个小bug,会出现两个文件选择框
在这里插入图片描述

在这里插入图片描述

相关代码

文件选择弹窗实现

package Struction;
import Struction.bobo;
import java.awt.EventQueue;
import javax.swing.JFrame;
import java.awt.Button;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.io.File;
import java.lang.reflect.Method;
import java.nio.file.Path;
import java.awt.event.ActionEvent;
import java.awt.TextField;
import javax.swing.JTextField;
import javax.swing.filechooser.FileSystemView;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.security.auth.callback.ConfirmationCallback;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import java.awt.Color;
import java.awt.Font;
import java.awt.HeadlessException;
import java.awt.Panel;
public class panel extends JFrame {
	public static Method method;
	JFrame frame;
	String path="";
	int count = 0;
	private JTextField textField;
	/**
	 * Launch the application.
	 */
	public String chooseFile() {
		// 弹出文件浏览窗口
		JFileChooser chooser = new JFileChooser();
		// 显示对话框
		int res = chooser.showOpenDialog(this);
		// 如果点击的是确认按钮
		if (res == JFileChooser.APPROVE_OPTION) {
			File file = chooser.getSelectedFile();
			textField.setText(file.getAbsolutePath());
		    path=chooser.getSelectedFile().getPath();
		    return path;
			}
		return  null;
	}
	public void closeThis() {
		frame.dispose();
	}
	/**
	 * Create the application.
	 */
	public panel() {
		initialize();
	}
	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setFont(new Font("Dialog", Font.BOLD | Font.ITALIC, 12));
		frame.setTitle("\u56DE\u6587\u5206\u6790");
		frame.getContentPane().setBackground(new Color(152, 251, 152));
		frame.getContentPane().setForeground(new Color(255, 215, 0));
		frame.setBounds(100, 100, 410, 218);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		Button button = new Button("\u9009\u62E9");
		button.setBackground(new Color(192, 192, 192));
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				chooseFile(); 
			}
		});
		button.setBounds(303, 50, 62, 24);
		frame.getContentPane().add(button);
		textField = new JTextField();
		textField.setBounds(72, 50, 222, 24);
		frame.getContentPane().add(textField);
		textField.setColumns(10);
		
		JLabel lblNewLabel = new JLabel("\u9009\u62E9\u6240\u5904\u7406\u6587\u4EF6\u5730\u5740\uFF1A");
		lblNewLabel.setFont(new Font("宋体", Font.BOLD | Font.ITALIC, 16));
		lblNewLabel.setBounds(86, 13, 208, 24);
		frame.getContentPane().add(lblNewLabel);
		frame.setLocationRelativeTo(getOwner());
		
		JButton btnNewButton = new JButton("\u786E\u5B9A");
		btnNewButton.setBackground(new Color(192, 192, 192));
		btnNewButton.setForeground(new Color(0, 0, 0));
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				closeThis();
				bobo window = new bobo();
				window.frame.setVisible(true);
				window.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			}
		});
		btnNewButton.setBounds(303, 90, 62, 24);
		frame.getContentPane().add(btnNewButton);
	}
	
}

主方法类

package Struction;

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.JTextField;
import javax.swing.RepaintManager;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Panel;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.nio.file.Path;
import java.util.concurrent.CountDownLatch;

import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import Struction.panel;

//对栈类进行定义
class Stack2 {// 顺序栈是栈的顺序实现
	private String[] s; // 使用数组来存贮栈中的元素,入栈和出栈都在栈顶进行
	private int top = -1 ;// 栈的索引 top表示栈顶,初始化为-1,栈顶的位置随出栈和入栈操作变化而变,需要设置top来记录当前栈顶元素在数组中的位置。
//    构造方法

	/*
(1)使用txt文件存储英文文章
(2)统计英文文章单词总数
(3)统计英文文章中回文单词数
(4)计算文章中的回文单词比率
	 */
	public Stack2(int n) {
		s = new String[n];
	}

// 入栈--push
	public void push(String value) {
		// 判断栈是否满
		if (isFull()) {
			System.out.println("栈满了");
		}
		s[++top] = value;// 先运算,再++
	}

// 出栈--pop,将栈顶的数据返回
	public String pop() {
		// 判断栈是否空
		if (isEmpty()) {
			// 抛出异常
			throw new RuntimeException("栈空,没有数据");
		}
		return s[top--];// 先赋值,再--
	}

//栈空
	public boolean isEmpty() {
		return top == -1;
	}

//栈满
	public boolean isFull() {
		return top == s.length - 1;
	}

//栈的长度
	public int size() {
		return top + 1;
	}
}

public class bobo extends panel {
	// 面板变量
	JFrame frame;
	private JTextField text1;// 文本框
	private JTextField text2;
	private JTextField text3;
	public static String path1;
	private JScrollPane scrollPane;// 滚动面板
	private JTextArea Context; // 文本域
	static panel p = new panel();

	static int sum;
	static int number1;
	static double number2;
	static String s1 = "";
	static String[] s2;
	static String s3 = "";

	// 用于判断传入的文章是否是字母,如果字符为字母,则返回 true;否则返回 false。
	private static boolean ifword(String s) {
		if (s.length() == 0) {
			return false;
		}
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			if (!Character.isLetter(c)) {
				return false;
			}
		}
		return true;
	}

	private static boolean start(String s) {
		Stack2 st = new Stack2(s.length());//确定st的长度
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			st.push(c + ""); //将读取的逐个字符入栈
		}
		String s1 = "";
		for (int i = 0; i < s.length(); i++) {
			s1 = s1 + st.pop();// 出栈
		}
		if (s.equals(s1)) { // 判断进出是否相同,相同返回true,不相同返回false
			return true;
		}
		return false;
	}
//按照题意,将大写字母转化为小写字母
	private static String panduan(String s) {
		String ds = "";
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			if (Character.isLetter(c)) {
				if (Character.isUpperCase(c)) {
					c = Character.toLowerCase(c); 
				}
				ds = ds + c;
			}
		}
		return ds;
	}
// 通过调用spilt方法将文章每个单词逐个存入数组中,但是其中混有.,并且规范每一行的单词数,每行最多16个单词
	private static String sort(String en) {
		String[] a = en.split(" ");
		String Sorten = "  ";
		for (int i = 0; i < a.length; i++) {
			Sorten = Sorten + a[i] + " ";
			if (i % 15 == 0 && i != 0) {
				Sorten = Sorten + "\r\n"; 
			}
		}
		return Sorten;
	}

// 通过选择文件弹窗,获得地址,将地址传入到bufferedReader io流读取文件信息
	public static void main(String[] args) throws Exception {
		BufferedReader b = new BufferedReader(new FileReader(p.chooseFile()));
		String en;
		// 表示每次读取一行数据 直到为空退出循环, 对文本进行分隔 换行 排序
		while ((en = b.readLine()) != null) {
			s1 += en + " ";
			en = sort(en);// 对文本进行分隔 换行 排序
			s3 += en + "\r\n";
		}
		s2 = s1.split(" ");
		Stack2 stack = new Stack2(s2.length);
		for (String s : s2) { // 遍历每个元素
			s = panduan(s);// 判断是否是大写字母
			if (ifword(s)) {// 判断是否是字母
				if (start(s)) {// 判断是否回文
					number1++;
				}
				if (s.length() != 0) {
					stack.push(s);
				}
			}
		}
		sum = stack.size();
		number2 = ((double) number1 / (double) sum); //求回文率
		b.close();//关闭流
		EventQueue.invokeLater(new Runnable() { ///它封装了异步事件指派机制,该机制从队列中提取事件,不允许同时从该队列中指派多个事件。 按顺序指派。 
			public void run() {
				try {
					panel p = new panel();
					p.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public bobo() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setResizable(false);
		frame.getContentPane().setBackground(Color.YELLOW);
		frame.getContentPane().setForeground(Color.BLACK);
		frame.setBounds(100, 100, 786, 652);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(getOwner());

		JLabel lable = new JLabel("\u82F1\u6587\u6587\u7AE0");
		lable.setBounds(14, 159, 156, 46);
		lable.setFont(new Font("宋体", Font.PLAIN, 39));

		JLabel label1 = new JLabel("\u5355\u8BCD\u603B\u6570:");
		label1.setBounds(29, 291, 88, 21);
		label1.setFont(new Font("宋体", Font.PLAIN, 18));

		JLabel label2 = new JLabel("\u56DE\u6587\u5355\u8BCD\u6570:");
		label2.setBounds(29, 343, 99, 21);
		label2.setFont(new Font("宋体", Font.PLAIN, 18));

		JLabel label3 = new JLabel("\u56DE\u6587\u7387:");
		label3.setBounds(29, 401, 78, 21);
		label3.setFont(new Font("宋体", Font.PLAIN, 18));

		text1 = new JTextField();
		text1.setBounds(29, 312, 42, 24);
		text1.setEditable(false);
		text1.setColumns(10);

		text2 = new JTextField();
		text2.setBounds(29, 364, 42, 24);
		text2.setEditable(false);
		text2.setColumns(10);

		text3 = new JTextField();
		text3.setBounds(29, 424, 141, 21);
		text3.setEditable(false);
		text3.setColumns(10);

		text1.setText("" + sum);
		text2.setText("" + number1);
		String sh = "" + (number2 * 100);
		text3.setText("" + sh + "%");
		scrollPane = new JScrollPane();
		scrollPane.setBounds(184, 0, 584, 605);
		scrollPane.setBackground(Color.WHITE);
		scrollPane.setForeground(Color.WHITE);
		scrollPane.setEnabled(false);
		frame.getContentPane().setLayout(null);
		frame.getContentPane().add(label2);
		frame.getContentPane().add(label1);
		frame.getContentPane().add(text1);
		frame.getContentPane().add(text2);
		frame.getContentPane().add(label3);
		frame.getContentPane().add(text3);
		frame.getContentPane().add(lable);
		frame.getContentPane().add(scrollPane);
		Context = new JTextArea();
		scrollPane.setViewportView(Context);
		Context.setEditable(false);
		Context.setForeground(Color.WHITE);
		Context.setFont(new Font("Monospaced", Font.PLAIN, 16));
		Context.setBackground(Color.PINK);
		Context.setText(s3);
	}
}

如有问题,感谢指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万物皆可der

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值