C# 如何使用FIFO堆栈解决这个难题?
我正在使用来自的一部分C代码来解决处理给定字符串中的退格问题。新的挑战是结合退格处理左箭头键和右箭头键,这反映了对书写错误的“纠正” 以下字符串表示使用FIFO堆栈的第一个挑战的问题和解决方案(归功于Sanjit Prasad): 字符串:这是一个带有一些拼写错误的txt文本 预期结果:这是一个有一些打字错误的文本 这是生成预期结果的代码:C# 如何使用FIFO堆栈解决这个难题?,c#,stack,C#,Stack,我正在使用来自的一部分C代码来解决处理给定字符串中的退格问题。新的挑战是结合退格处理左箭头键和右箭头键,这反映了对书写错误的“纠正” 以下字符串表示使用FIFO堆栈的第一个挑战的问题和解决方案(归功于Sanjit Prasad): 字符串:这是一个带有一些拼写错误的txt文本 预期结果:这是一个有一些打字错误的文本 这是生成预期结果的代码: static String finalAnswer(String S) { Stack<Char> q = new Stack<
static String finalAnswer(String S)
{
Stack<Char> q = new Stack<Char>();
for (int i = 0; i < S.Length; ++i)
{
if (S[i] != '#') q.Push(S[i]);
else if (q.Count!=0) q.Pop();
}
String ans = "";
while (q.Count!=0)
{
ans += q.Pop();
}
String answer = "";
for(int j = ans.Length - 1; j >= 0; j--)
{
answer += ans[j];
}
return answer;
}
静态字符串finalAnswer(字符串S)
{
堆栈q=新堆栈();
对于(int i=0;i=0;j--)
{
答案+=ans[j];
}
返回答案;
}
该代码非常有效,现在的挑战是处理以下字符串:
string: ths#is is an te\\\#///xt wit some\\\\\h///// tpos###ypos
expected result: this is a text with some typos
string:this是一个te\\\\\\///xt,它有一些\\\\\\\\\\\\\\\\\\\\\\\\\\\///h///tpos
预期结果:这是一个有一些打字错误的文本
在上面的字符串中,字符“\”表示按下的左箭头键,“/”表示按下的右箭头键
非常感谢您的评论,这是我在Stackoverflow中的第一个问题,我想知道解决这个问题的方法。这是一个完成任务的版本,但需要一些边缘情况检查和更多错误检查
static string GenerateUpdatedString(string strInput)
{
var stringStack = new Stack<char>();//holds the string as it is read from the input
var workingStack = new Stack<char>();//hold chars when going back to fix typos
char poppedChar;
foreach (var ch in strInput)
{
switch (ch)
{
case '\\':
{
PushAndPopCharacters(workingStack, stringStack);
break;
}
case '/':
{
PushAndPopCharacters(stringStack, workingStack);
break;
}
case '#':
{
stringStack.TryPop(out poppedChar);
break;
}
default:
stringStack.Push(ch);
break;
}
}
return new string(stringStack.Reverse().ToArray());
}
static void PushAndPopCharacters(Stack<char> stackToPush, Stack<char> stackToPop)
{
char poppedChar;
if (stackToPop.TryPop(out poppedChar))
{
stackToPush.Push(poppedChar);
}
}
我可以想出一个解决方案,用两个堆栈来实现这一点,但如何用一个堆栈却让我不知所措。你只允许有一个堆栈吗?嗨@DetectivePikachu,不管怎样,这个想法都是为了解决这个挑战,谢谢!为处理反斜杠时从结果中弹出的字符添加另一个堆栈。类似地,当处理正斜杠时,您将从正斜杠弹出,将其推回到结果堆栈上。
static string GenerateUpdatedString(string strInput)
{
var stringStack = new Stack<char>();//holds the string as it is read from the input
var workingStack = new Stack<char>();//hold chars when going back to fix typos
char poppedChar;
foreach (var ch in strInput)
{
switch (ch)
{
case '\\':
{
PushAndPopCharacters(workingStack, stringStack);
break;
}
case '/':
{
PushAndPopCharacters(stringStack, workingStack);
break;
}
case '#':
{
stringStack.TryPop(out poppedChar);
break;
}
default:
stringStack.Push(ch);
break;
}
}
return new string(stringStack.Reverse().ToArray());
}
static void PushAndPopCharacters(Stack<char> stackToPush, Stack<char> stackToPop)
{
char poppedChar;
if (stackToPop.TryPop(out poppedChar))
{
stackToPush.Push(poppedChar);
}
}
var result = GenerateUpdatedString
(@"ths#is is an te\\\#///xt wit some\\\\\h///// tpos###ypos");