检测输入字符串中的括号

时间:2014-05-10 12:21:33

标签: c# wpf

我正在创建一个能够读取字符串并将其转换为乐谱的应用程序。

我们说我在这里有一个输入:

  

[0 [[5 6]]]

字符之间原来没有空格。只是为了可读性。

这是我想要实现的输出:

enter image description here

所以,这意味着我必须检测(简单的算法/程序流程):

  1. 如果有一个支架,我需要找到最深的一组括号(在这种情况下,5 6)并检测多少支架包裹它们(在这种情况下为2)
  2. 在5和6上绘制X(X =括号数)行(在本例中为2)
  3. 之后我需要找到括号外面的字符(在本例中为0),以及包裹它们的括号数量(在这种情况下为1)
  4. 在最后一条绘制线的最顶层的同一层上绘制1条线并连接它们。
  5. 所以, 摘要:

    如何执行步骤1和3(检测字符串上的括号),因为我已经知道如何在画布上绘制线条。

    顺便说一下,如果你有另一个更有效的而不是我的算法(1-4),请详细说明。

    感谢。请随时澄清任何事情。

    更新:删除[0 [5 6]]示例,因为它不正确。

    更新2

    更多例子

    [1 2 3]

    enter image description here

    [[[2 3]] 1]

    enter image description here

    [[3 4]]

    enter image description here

    [1 2]

    enter image description here

    如果您需要更多样品,请随时询问。

2 个答案:

答案 0 :(得分:0)

这对你的两个例子都是正确的,但我不知道在一般情况下是否正确。它也不会执行任何检查以确定输入是否格式正确。

var input = Console.ReadLine();

var digits = new List<Char>();

var numberBars = new List<Int32>();

var currentNumberBars = 0;

var newScope = true;

foreach (var symbol in input)
{
    if (symbol == '[')
    {
        currentNumberBars = newScope ? 1 : currentNumberBars + 1;

        newScope = false;
    }
    else if ((symbol >= '0') && (symbol <= '9'))
    {
        digits.Add(symbol);
        numberBars.Add(currentNumberBars);

        newScope = true;
    }
}

var maximumNumberBars = numberBars.Max();

Console.WriteLine();

for (var i = 0; i < digits.Count; i++)
{
    Console.WriteLine(digits[i] + new String('|', numberBars[i]).PadLeft(maximumNumberBars));
}

示例输出

[ 0 [ [ 5 6 ] ] ]

0 |
5||
6||

[ 0 5 6 ]

0|
5|
6|

[ 1 [[ 2 3 ]] 4 [[[ 5 [[ 6 ]] 7 ]]]]

1  |
2 ||
3 ||
4 ||
5|||
6 ||
7 ||

我刚认识到它可能是错误的,因为它没有正确地关闭示波器,但很难从你对问题的描述中看出来,我不知道背景是什么。这个用于音乐的符号是什么?

答案 1 :(得分:0)

这是一种不同的算法,它使当前的嵌套级别为条形数。它适用于除[ 0 [ [ 5 6 ] ] ]之外的所有示例,它会在5 6上获得3个小节,但对我而言,这似乎比我的第一个答案更直观。

var input = Console.ReadLine();

var digits = new List<Char>();

var numberBars = new List<Int32>();

var currentNumberBars = 0;

foreach (var symbol in input)
{
    if (symbol == '[')
    {
        currentNumberBars++;
    }
    else if (symbol == ']')
    {
        if (currentNumberBars == 0)
        {
            throw new InvalidOperationException();
        }

        currentNumberBars--;
    }
    else if ((symbol >= '0') && (symbol <= '9'))
    {
        digits.Add(symbol);
        numberBars.Add(currentNumberBars);
    }
}

if (currentNumberBars != 0)
{
    throw new InvalidOperationException();
}

var maximumNumberBars = numberBars.Max();

Console.WriteLine();

for (var i = 0; i < digits.Count; i++)
{
    Console.WriteLine(digits[i] + new String('|', numberBars[i]).PadLeft(maximumNumberBars));
}