1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
| using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
}
public void PostfixNotationExpression(IEnumerable<string> funcNames)//перечислитель funcNames для поочередного доступа к элементам коллекции operators
{
operators = new List<string>(funcNames);//коллекция операторов
operators.AddRange(standart_operators);//добавляем список операторов standart_operators в коллекцию операторв operators
}
private List<string> operators;
private List<string> standart_operators = new List<string>(new string[] { "(", ")", "+", "-", "*", "/", "=" });//инициализатор коллекции
public IEnumerable<string> Separate(string input)// ИТЕРАТОР!!! перечислитель для формирования строки s
{
input = Convert.ToString(textBox1.Text);
List<string> inputSeparated = new List<string>();//новая входная строка
int pos = 0;
while (pos < input.Length)// пока длина входной строки не будет равна 0
{
string s = string.Empty + input[pos];// строка S =пустая строка+элемент с индексом [pos] входной строки
if (!standart_operators.Contains(input[pos].ToString()))// если введенный элемент содержится в коллекции standart_operators
{
if (Char.IsDigit(input[pos]))//
for (int i = pos + 1; i < input.Length &&(Char.IsDigit(input[i]) || input[i] == ',' || input[i] == '.'); i++)
s += input[i];// в строку S записываем элемент с индексом i, если он является цифрой
else if (Char.IsLetter(input[pos]))//если символ с индексом [pos] буква, то
for (int i = pos + 1; i < input.Length && (Char.IsLetter(input[i]) || Char.IsDigit(input[i])); i++)
s += input[i];// в строку записываем символ с индексом [i]
}
yield return s;// возвращаем строку s
pos += s.Length;// индекс pos теперь = длине строки S
}
}//формирование строки s
private byte GetPriority(string s)//расстановка приоритетов
{
switch (s)//если в строке s встречаются данные символы , то им раздаются приоритеты
{
case "(":
return 0;
case ")":
return 1;
case "+":
return 2;
case "-":
return 3;
case "*":
case "/":
return 4;
case "=":
return 5;
default:
return 6;
}
}
public string ConvertToPostfixNotation(string input)
{
List<string> outputSeparated = new List<string>();// создаем коллекцию outputSeparated
Stack<string> stack = new Stack<string>();// создаем коллекцию стек
foreach (string c in Separate(input))
{
if (operators.Contains(c))
{
if (stack.Count > 0 && !c.Equals("("))//если количество элементов стека больше 0 и равно )
{
if (c.Equals(")"))//если с=), то
{
string s = stack.Pop();// ...помещается на вершину стека
while (s != "(")// пока в строке s не встретится очередная (
{
outputSeparated.Add(s);
s = stack.Pop();
}
}
else if (GetPriority(c) >= GetPriority(stack.Peek()))//если элемент c больше по приоритету эелемнта стоящего сейчас на вершине стека
stack.Push(c);//то он помещается на вершину стека
else
{
while (stack.Count > 0 && GetPriority(c) < GetPriority(stack.Peek()))//если количество эелементов стека больше 0 и если эелемент c по приоритету меньше чем верхний эелемент стека, то...
outputSeparated.Add(stack.Pop());//удаляем эелемеент находящийся на вершине стека, а ...
stack.Push(c);// с проталкиваем наверх
}
}
else
stack.Push(c);//если количество элементов стека меньше 0 и не равно ), то с проталкиваем наверх стека
}
else
outputSeparated.Add(c);
}
if (stack.Count > 0)
foreach (string c in stack)
outputSeparated.Add(c);
return string.Join("", outputSeparated.ToArray());
}
}
} |