Java Stack实现句号检测逐句反转句子开发咨询
逐句反转的实现调整
当前逻辑没有做句子边界识别:直接将整段文本拆分出的所有单词全部压入同一个栈,弹栈时自然会跨句子把内容整体倒序,和逐句反转的需求不匹配。
要实现目标效果,可按照「句子拆分-单句反转-拼接还原」的思路调整,核心改动点:
- 先按句号将原文本切分为独立的句子片段,跳过空的无效片段
- 对每个句子片段单独执行单词反转:
- 将片段拆为单词压入栈,注意不要把附着在单词上的句号当成普通单词压栈,避免标点位置错位
- 弹栈拼接出单词逆序的句子主体,再将剥离的句号补回句子末尾
- 将所有处理完成的反转句子按原顺序拼接,清理多余空格后输出即可
改进后的可运行代码
import java.util.Stack; import java.util.Scanner; public class NolascoStackReverse { public static void main (String[] args) { Scanner in = new Scanner(System.in); Stack<String> wordStack = new Stack<>(); StringBuilder totalOutput = new StringBuilder(); System.out.println("Enter a sentence to be reversed: "); String str = in.nextLine(); // 按句号分割句子,正则中.为特殊字符需转义 String[] sentenceList = str.split("\\."); for (String rawSentence : sentenceList) { String cleanedSentence = rawSentence.trim(); // 跳过空片段(兼容文本末尾连续输入句号的场景) if (cleanedSentence.isEmpty()) { continue; } // 拆单词入栈 String[] words = cleanedSentence.split(" "); for (String word : words) { // 过滤连续空格产生的空字符串 if (!word.isEmpty()) { wordStack.push(word); } } // 弹栈拼接单句反转内容 StringBuilder reversedPart = new StringBuilder(); while (!wordStack.empty()) { reversedPart.append(wordStack.pop()).append(" "); } // 清理末尾空格,补句号后追加到总输出 totalOutput.append(reversedPart.toString().trim()) .append(". "); } System.out.println("Here is the reversed order: "); // 清理总输出末尾多余的空格后打印 System.out.println(totalOutput.toString().trim()); } }
效果说明
输入测试文本Hello my name is blank. nice to meet you.时,程序会将文本按句号切分为两个独立句子,分别完成单词反转后拼接,最终输出结果为blank is name my Hello. you meet to nice.,和预期完全一致。
如果后续需要兼容感叹号、问号等其他作为句子边界的标点,只需在拆分逻辑中扩展对应识别规则,将标点剥离后补回句子末尾即可,整体逻辑无需调整。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

