如何用Java Stack类实现字符串拆分提取元音、辅音及非字母字符
问题排查
- 变量命名违规:Stack实例的变量名用了Java内置类名
String,会直接引发编译冲突。 - 栈操作逻辑错误:仅向栈中push了1次输入字符串,连续调用2次pop()会触发
EmptyStackException空栈异常。 - 方法调用错误:
replace()方法不支持正则匹配,正则替换需要调用replaceAll()方法。 - 提取逻辑反转:代码中
replace("[aeiou]","")是删除元音字符,和提取元音的需求完全相反。 - 输出逻辑错误:最终内容未过滤字母字符,直接输出原输入字符串,不符合需求。
修复后可运行代码
import java.util.Scanner; import java.util.Stack; public class PushPop { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("Enter a String : "); String str = sc.nextLine(); // 定义三个栈分别存储元音、辅音、非字母字符 Stack<Character> vowelStack = new Stack<>(); Stack<Character> consonantStack = new Stack<>(); Stack<Character> otherStack = new Stack<>(); // 遍历每个字符分类入栈 for (char c : str.toCharArray()) { if (Character.isLetter(c)) { char lowerC = Character.toLowerCase(c); if (lowerC == 'a' || lowerC == 'e' || lowerC == 'i' || lowerC == 'o' || lowerC == 'u') { vowelStack.push(c); } else { consonantStack.push(c); } } else { otherStack.push(c); } } // 按输入顺序拼接栈内字符 StringBuilder vowels = new StringBuilder(); for (Character c : vowelStack) { vowels.append(c); } StringBuilder consonants = new StringBuilder(); for (Character c : consonantStack) { consonants.append(c); } StringBuilder finalContent = new StringBuilder(); for (Character c : otherStack) { finalContent.append(c); } // 按要求输出 System.out.println("Vowels : " + vowels); System.out.println("Consonant : " + consonants); System.out.println("Final contents : " + finalContent); } }
效果验证
输入样例hello1234!@#$时,输出和需求完全一致:
Enter a String : hello1234!@#$ Vowels : eo Consonant : hll Final contents : 1234!@#$
内容的提问来源于stack exchange,提问作者Nico Ni
相关产品推荐
相关产品推荐

