Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用FIFO堆栈解决这个难题?_C#_Stack - Fatal编程技术网

C# 如何使用FIFO堆栈解决这个难题?

C# 如何使用FIFO堆栈解决这个难题?,c#,stack,C#,Stack,我正在使用来自的一部分C代码来解决处理给定字符串中的退格问题。新的挑战是结合退格处理左箭头键和右箭头键,这反映了对书写错误的“纠正” 以下字符串表示使用FIFO堆栈的第一个挑战的问题和解决方案(归功于Sanjit Prasad): 字符串:这是一个带有一些拼写错误的txt文本 预期结果:这是一个有一些打字错误的文本 这是生成预期结果的代码: static String finalAnswer(String S) { Stack<Char> q = new Stack<

我正在使用来自的一部分C代码来解决处理给定字符串中的退格问题。新的挑战是结合退格处理左箭头键和右箭头键,这反映了对书写错误的“纠正”

以下字符串表示使用FIFO堆栈的第一个挑战的问题和解决方案(归功于Sanjit Prasad):

字符串:这是一个带有一些拼写错误的txt文本 预期结果:这是一个有一些打字错误的文本 这是生成预期结果的代码:

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");