1
class Program
2
{
3
static void Main(string[] args)
4
{
5
char[,] cOperTable =
6
{
7
{ '>', '>', '<', '<', '<', '>', '>' },
8
{ '>', '>', '<', '<', '<', '>', '>' },
9
{ '>', '>', '>', '>', '<', '>', '>' },
10
{ '>', '>', '>', '>', '<', '>', '>' },
11
{ '<', '<', '<', '<', '<', '=', ' ' },
12
{ '>', '>', '>', '>', ' ', '>', '>' },
13
{ '<', '<', '<', '<', '<', ' ', '=' }
14
};
15
16
string strExp = "1+2-3-(3+2*8)*2#";
17
string strOpe = "+-*/()#"; // 0 1 2 3 4 5 6 7
18
Stack vStack = new Stack(); //值栈
19
Stack oStack = new Stack(); //操作符栈
20
oStack.Push('#');
21
22
for (int i = 0; i < strExp.Length; i++)
23
{
24
char c = strExp[i];
25
26
while (c != '#' || (char)oStack.Peek() != '#')
27
{
28
if (char.IsNumber(c))
29
{
30
vStack.Push(c); break;
31
}
32
else
33
{
34
bool goNext = true;
35
36
switch(cOperTable[strOpe.IndexOf((char)oStack.Peek()),strOpe.IndexOf(c)])
37
{
38
case '<':oStack.Push(c);break;
39
case '=':oStack.Pop(); break;
40
case '>':
41
char theta = (char)oStack.Pop(); //操作符
42
object b = vStack.Pop();
43
object a = vStack.Pop();
44
int ib = 0;
45
int ia = 0;
46
47
if (b is char) ib = (int)(char)b - 48;
48
else if (b is int) ib = (int)b;
49
if (a is char) ia = (int)(char)a - 48;
50
else if (a is int) ia = (int)a;
51
52
vStack.Push(Operate(ia, theta, ib));
53
break;
54
}//end switch
55
56
if (goNext) break;
57
}
58
}//exit while
59
}//exit for
60
61
Console.WriteLine("{0}",vStack.Pop());
62
Console.ReadKey();
63
}
64
65
static int Operate(int a, char theta, int b)
66
{
67
switch (theta)
68
{
69
case '+': return a + b;
70
case '-': return a - b;
71
case '*': return a * b;
72
case '/': return a / b;
73
default: return 0;
74
}
75
}
76
}
class Program2
{3
static void Main(string[] args)4
{5
char[,] cOperTable = 6
{7
{ '>', '>', '<', '<', '<', '>', '>' },8
{ '>', '>', '<', '<', '<', '>', '>' },9
{ '>', '>', '>', '>', '<', '>', '>' },10
{ '>', '>', '>', '>', '<', '>', '>' },11
{ '<', '<', '<', '<', '<', '=', ' ' },12
{ '>', '>', '>', '>', ' ', '>', '>' },13
{ '<', '<', '<', '<', '<', ' ', '=' }14
};15

16
string strExp = "1+2-3-(3+2*8)*2#";17
string strOpe = "+-*/()#"; // 0 1 2 3 4 5 6 718
Stack vStack = new Stack(); //值栈19
Stack oStack = new Stack(); //操作符栈20
oStack.Push('#');21

22
for (int i = 0; i < strExp.Length; i++)23
{24
char c = strExp[i];25

26
while (c != '#' || (char)oStack.Peek() != '#')27
{28
if (char.IsNumber(c))29
{30
vStack.Push(c); break;31
}32
else33
{34
bool goNext = true;35

36
switch(cOperTable[strOpe.IndexOf((char)oStack.Peek()),strOpe.IndexOf(c)])37
{38
case '<':oStack.Push(c);break;39
case '=':oStack.Pop(); break;40
case '>':41
char theta = (char)oStack.Pop(); //操作符42
object b = vStack.Pop();43
object a = vStack.Pop();44
int ib = 0;45
int ia = 0;46

47
if (b is char) ib = (int)(char)b - 48;48
else if (b is int) ib = (int)b;49
if (a is char) ia = (int)(char)a - 48;50
else if (a is int) ia = (int)a;51

52
vStack.Push(Operate(ia, theta, ib));53
break;54
}//end switch55

56
if (goNext) break;57
}58
}//exit while59
}//exit for60

61
Console.WriteLine("{0}",vStack.Pop());62
Console.ReadKey();63
}64

65
static int Operate(int a, char theta, int b)66
{67
switch (theta)68
{69
case '+': return a + b;70
case '-': return a - b;71
case '*': return a * b;72
case '/': return a / b;73
default: return 0;74
}75
}76
}

浙公网安备 33010602011771号