如何用Java将字符串逐字符存入栈并弹出元音仅保留辅音
现有代码问题梳理
- 泛型类型错误:你要存储单个字符,栈的泛型应该声明为
Stack<Character>,而非Stack<String>,实例化时也需要补全泛型避免类型安全警告。 - 入栈逻辑错误:循环中你调用
stack.add(str)是把整个输入字符串重复压入栈,而非你取到的单个字符ch,这是核心逻辑错误。
实现步骤
- 预先定义元音字符集合,支持大小写匹配,方便快速判断字符是否为元音。
- 遍历输入字符串的每一个字符,依次压入栈中。
- 弹出栈中所有元素,判断每个元素是否为元音:如果是元音直接丢弃,如果是辅音则存入临时栈保留。
- 如果需要保留辅音在原字符串中的相对顺序,将临时栈的元素再次弹出,就能得到和原顺序一致的辅音序列。
修正后可运行代码
import java.util.Stack; import java.util.Scanner; import java.util.Set; import java.util.HashSet; public class StackProcess { public static void main(String args[]) { // 定义元音集合,包含大小写 Set<Character> vowels = new HashSet<>(); vowels.add('a'); vowels.add('e'); vowels.add('i'); vowels.add('o'); vowels.add('u'); vowels.add('A'); vowels.add('E'); vowels.add('I'); vowels.add('O'); vowels.add('U'); Scanner sc = new Scanner(System.in); System.out.print("Input a String: "); String str = sc.nextLine(); Stack<Character> charStack = new Stack<>(); // 每个字符入栈 for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); charStack.push(ch); } System.out.println("The original stack is: " + charStack); // 弹出元音,保留辅音 Stack<Character> consonantStack = new Stack<>(); while (!charStack.isEmpty()) { Character current = charStack.pop(); // 不是元音就存入辅音栈 if (!vowels.contains(current)) { consonantStack.push(current); } } // 恢复字符原顺序 Stack<Character> resultStack = new Stack<>(); while (!consonantStack.isEmpty()) { resultStack.push(consonantStack.pop()); } System.out.print("The stack after removing vowels is: " + resultStack); sc.close(); } }
代码说明
- 用
HashSet存储元音字符,判断时间复杂度为O(1),比逐个字符串匹配效率更高。 - 两次倒栈的操作保证最终留存的辅音字符和原输入字符串中的顺序完全一致,如果不需要保留原顺序,直接输出
consonantStack即可。
内容的提问来源于stack exchange,提问作者Nico Ni
相关产品推荐
相关产品推荐

