题目如下:
第一种方法:
class Program
{
static void Main(string[] args)
{
//一行数学公式,在这个公式里有N个括号,
//其中各括号可以互相嵌套,请你写一个函
//数找出指定的第N个括号中的全部内容。
string data = "int i = 1 + 3 + (3 * 4) - 23 * ((223 + 434) + ((333 + 2) * (233 + 33) + 22) + (2324 + 434));";
//获取第1个括号里的内容
Console.WriteLine("第一个括号的内容:" + GetValue(data, 1));
//获取第2个括号里的内容
Console.WriteLine("第二个括号的内容:" + GetValue(data, 2));
//获取第3个括号里的内容
Console.WriteLine("第三个括号的内容:" + GetValue(data, 3));
//获取第4个括号里的内容
Console.WriteLine("第四个括号的内容:" + GetValue(data, 4));
Console.ReadLine();
}
/// <summary>
/// 获取指定第N个括号中的全部内容
/// </summary>
/// <param name="value"></param>
/// <param name="x"></param>
/// <returns></returns>
public static string GetValue(string value, int x)
{
char[] oldData = value.ToArray();
List<char> result = new List<char>();
int start = -1;
int end = -1;
int Number = 0;
int Count = 0;
for (int i = 0; i < oldData.Length; i++)
{
var a = oldData[i];
switch (oldData[i])
{
case '(':
{
Count++;
if (Count == x)
{
if (start == -1)
{
start = i + 1;
}
else
{
Number++;
}
Count--;
}
} break;
case ')':
{
if (start != -1)
{
if (Number == 0)
{
end = i;
}
else
{
Number--;
}
}
} break;
}
//大于开始就开始记录数据
if (start != -1 && i >= start && end == -1)
{
result.Add(oldData[i]);
}
else if (end != -1)
{
break; // 否则就跳出遍历。
}
}
return string.Join(string.Empty,result);
}
}
第二种方法:
/// <summary>
/// 获取指定第N个括号中的全部内容
/// </summary>
/// <param name="value"></param>
/// <param name="x"></param>
/// <returns></returns>
public static string GetValue(string value, int x) //堆栈实现 字典实现
{
var oldData = value.ToArray();
List<char> result = new List<char>();
int start = -1;
int end = -1;
int Number = 0;
//找到需要的x的位置
for (int i = 0; i < oldData.Length; i++)
{
if (oldData[i] == '(')
{
Number++;
}
if (Number == x)
{
start = i + 1;
break;
}
}
Number = 0;//复用,用做插队的计数
//从找到的位置开始找下一个同伴对应的位置
for (int i = start; i < oldData.Length; i++)
{
var a = oldData[i];
if (a == '(')
{
if (start == -1)
{
start = i + 1;
}
else
{
Number++;
}
}
else if (a == ')')
{
if (start != -1)
{
if (Number == 0)
{
end = i;
}
else
{
Number--;
}
}
}
//大于开始就开始记录数据
if (start != -1 && i >= start && end == -1)
{
result.Add(oldData[i]);
}
else if (end != -1)
{
break; // 否则就跳出遍历。
}
}
return string.Join(string.Empty, result);
}
第三种方法:
/// <summary>
/// 获取指定第N个括号中的全部内容
/// </summary>
/// <param name="value"></param>
/// <param name="x"></param>
/// <returns></returns>
public static string GetValue(string value, int x) //堆栈实现 字典实现
{
var oldData = value.ToArray();
Stack<int> stack = new Stack<int>();
Dictionary<int, int> DataList = new Dictionary<int, int>();
int count = 0;
int target = 0;
//获取所有自对应伙伴(一对一对的)
for (int i = 0; i < oldData.Length; i++)
{
if (oldData[i] == '(')
{
stack.Push(i + 1);
count++;
if (count == x)
{
target = i + 1;
}
}
else if (oldData[i] == ')')
{
DataList.Add(stack.Pop(), i);
}
}
//获取x值所在的位置
return value.Substring(target, DataList[target] - target);
}
结果: