C#基于Stack栈结构解析嵌套括号字符串输出元素对应层级
层级解析问题解决方案
需求说明
现有字符串string s = "{abc,def,{pqr, {xyz}}}",规则为每出现一个{层级深度加1,每出现一个}层级深度减1,需要使用Stack栈数据结构编写C#代码,最终输出如下结果:
- abc - Level 1
- def - Level 1
- pqr - Level 2
- xyz - Level 3
原有代码问题
你的代码存在几个核心逻辑错误:
- 层级初始值计算错误:原始字符串第一个字符就是
{,你初始level设为1,遇到{后直接加1,会导致最外层元素的层级多计算1级 - 栈存取逻辑错误:遇到非字母的分隔符(逗号、空格、大括号)时才应该判定当前单词是否读取完成,而不是随便遇到非push状态就弹栈
- 输出顺序错误:Stack是后进先出结构,直接连续Pop得到的字符顺序是倒序的,需要反转后才能得到正确的单词
- 没有处理分隔符过滤逻辑,会输出大量无效空内容
修正后的完整可运行代码
using System; using System.Collections; using System.Text; public class HelloWorld { public static void Main() { string str = "{abc,def,{pqr, {xyz}}}"; Stack charStack = new Stack(); int level = 0; foreach (char c in str) { // 遇到左括号层级加1,跳过后续逻辑 if (c == '{') { level++; continue; } // 遇到右括号先输出未完成的单词,再层级减1 else if (c == '}') { if (charStack.Count > 0) { OutputWord(charStack, level); } level--; continue; } // 遇到逗号或空格,说明当前单词读取完成,输出后清空栈 else if (c == ',' || c == ' ') { if (charStack.Count > 0) { OutputWord(charStack, level); } continue; } // 普通字符直接入栈 charStack.Push(c); } } // 封装单词输出方法 private static void OutputWord(Stack charStack, int level) { StringBuilder sb = new StringBuilder(); // 栈是倒序存储,依次弹出插入到字符串开头就能得到正确单词 while (charStack.Count > 0) { sb.Insert(0, charStack.Pop()); } Console.WriteLine($"{sb.ToString()} - Level {level}"); } }
运行输出结果
abc - Level 1 def - Level 1 pqr - Level 2 xyz - Level 3
内容的提问来源于stack exchange,提问作者kumar
相关产品推荐
相关产品推荐

