Проблема с получением 2 символов из строки с помощью индексатора - PullRequest
0 голосов
/ 24 июля 2009

У меня проблема с чтением значений char. Смотрите мою программу ниже. Я хочу вычислить инфиксное выражение.
Как вы можете видеть, я хочу прочитать '10', '*', '20' и затем использовать их ... но если я использую строковый индексатор, то s [0] будет '1 ', а не' 10 ', и поэтому я не могу получить ожидаемый результат. Ребята, вы можете мне что-нибудь предложить? Код в c #

class Program
    {
        static void Main(string[] args)
        {
            string infix = "10*2+20-20+3";
            float result = EvaluateInfix(infix);
            Console.WriteLine(result);
            Console.ReadKey();

        }

        public static float EvaluateInfix(string s)
        {
            Stack<float> operand = new Stack<float>();
            Stack<char> operator1 = new Stack<char>();
            int len = s.Length;
            for (int i = 0; i < len; i++)
            {
                if (isOperator(s[i]))  // I am having an issue here as s[i] gives each character and I want the number 10 
                    operator1.Push(s[i]);
                else
                {
                    operand.Push(s[i]);
                    if (operand.Count == 2)
                        Compute(operand, operator1);
                }
            }

            return operand.Pop();


        }

        public static void Compute(Stack<float> operand, Stack<char> operator1)
        {
            float operand1 = operand.Pop();
            float operand2 = operand.Pop();
            char op = operator1.Pop();

            if (op == '+')
                operand.Push(operand1 + operand2);
            else
                if(op=='-')
                    operand.Push(operand1 - operand2);
                else
                    if(op=='*')
                        operand.Push(operand1 * operand2);
                    else
                        if(op=='/')
                            operand.Push(operand1 / operand2);
        }




        public static bool isOperator(char c)
        {
            bool result = false;
            if (c == '+' || c == '-' || c == '*' || c == '/')
                result = true;
            return result;
        }




    }
}

Ответы [ 2 ]

0 голосов
/ 24 июля 2009

Сохраните числовое значение в переменной и нажмите его, когда вы встретите оператор или конец строки:

int num = 0;
foreach (char c in s) {
   if (isOperator(c)) {
      if (num != 0) {
         operand.Push(num);
         num = 0;
      }
      operator1.Push(c);
      if (operand.Count == 2) {
         Compute(operand, operator1);
      }
   } else {
      num = num * 10 + (int)(c - '0');
   }
}
if (num != 0) {
   operand.Push(num);
}
0 голосов
/ 24 июля 2009

Вам нужно будет разделить строку - это означает, что вы точно определите , как вы хотите разделить строку. Я подозреваю, что в этом случае вы найдете Regex.Split наиболее подходящим инструментом расщепления, поскольку вы имеете дело с паттернами. Кроме того, вы можете написать свою собственную процедуру расщепления.

Вам нужно иметь дело только с целыми числами и операторами? Как насчет пробелов? Кронштейны? Ведущие отрицательные числа? Умножение на отрицательные числа (например, «3 * -5»)?

...