Как решить эту проблему, используя стек FIFO? - PullRequest
0 голосов
/ 31 октября 2019

Я использую часть кода C # из Sanjit Prasad , чтобы решить задачу обработки обратных символов в заданной строке слов. Новая задача заключается в обработке клавиши со стрелкой влево и клавиши со стрелкой вправо в сочетании с символами возврата, отражающими «корректор» для опечаток в письменной форме.

Следующая строка представляет проблему и решение для первойвызов с использованием стека FIFO (кредиты Sanjit Prasad):

string: thiss# is a txt##ext with some typos
expected result: this is a text with some typos

Этот код для получения ожидаемого результата:

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;  
}

Этот код работает отлично, теперь задача состоит в том,обработать следующую строку:

string: ths#is is an te\\\#///xt wit some\\\\\h///// tpos###ypos
expected result: this is a text with some typos

В приведенной выше строке символ "\" обозначает нажатую клавишу со стрелкой влево, а "/" нажатую клавишу со стрелкой вправо.

Спасиботак что за все ваши комментарии, это мой самый первый вопрос в Stackoverflow, я хотел бы узнать подход к решению этой проблемы.

1 Ответ

0 голосов
/ 01 ноября 2019

Вот версия, которая выполняет работу, но потребует некоторых проверок для крайних случаев и еще нескольких проверок ошибок.

        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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...