1
/**//// <summary>
2
/// 四则运算
3
/// </summary>
4
/// <returns>返回结果</returns>
5
public int EvaluateExpression()
6
{
7
SeqStack<char> optr = new SeqStack<char>(20); //存放操作符栈
8
SeqStack<int> opnd = new SeqStack<int>(20); //存放操作数栈
9
10
optr.Push('#');
11
char c = (char)Console.Read(); //读取每一个数
12
bool isLoop = true; //定义一个循环变量
13
char tmp = default(char); //临时操作符
14
int a = 0; //计算数1
15
int b = 0; //计算数2
16
while (isLoop)
17
{
18
if (c == '#' && opnd.Top == 0)
19
isLoop = false;
20
if (c != '+' && c != '-' && c != '*' && c != '/' && c != '(' && c != ')' && c != '#')//不是操作数入数据栈
21
{
22
opnd.Push(((int)c)- 48);
23
c = (char)Console.Read();
24
}
25
else
26
{
27
switch (Precede(optr.GetTop(), c))
28
{
29
case '<':
30
optr.Push(c);
31
c = (char)Console.Read();
32
break;
33
case '=':
34
optr.Pop();
35
c = (char)Console.Read();
36
break;
37
case '>':
38
tmp = optr.Pop();
39
a = opnd.Pop();
40
b = opnd.Pop();
41
opnd.Push(Operate(b, tmp, a));
42
break;
43
default:
44
throw new System.ExecutionEngineException("输入错误格式错误!");
45
break;
46
}
47
}
48
}
49
return opnd.Pop();
50
}
51
52
//判断优先级
53
private char Precede(char optr1, char optr2)
54
{
55
//定义一个比较结果(用二维数组存下来)
56
char[,] optrTable =
{
57

{ '>', '>', '<', '<', '<', '>', '>' },
58

{ '>', '>', '<', '<', '<', '>', '>' },
59

{ '>', '>', '>', '>', '<', '>', '>' },
60

{ '>', '>', '>', '>', '<', '>', '>' },
61

{ '<', '<', '<', '<', '<', '=', '?' },
62

{ '>', '>', '>', '>', '?', '>', '>' },
63

{ '<', '<', '<', '<', '<', '?', '=' } };
64
65
int x = 0, y = 0;//申明存符号转化后的整数
66
67
//定义一个符号数组
68
char[] optrs =
{ '+', '-', '*', '/', '(', ')', '#' };
69
for (int i = 0; i < optrs.Length; ++i)
70
{
71
if (optr1 == optrs[i])
72
x = i;
73
if (optr2 == optrs[i])
74
y = i;
75
}
76
77
return optrTable[x, y];
78
}
79
80
//计算两值,得出相应结果
81
private int Operate(int a, char optr, int b)
82
{
83
int result = default(int);
84
switch (optr)
85
{
86
case '+':
87
result = a + b;
88
break;
89
case '-':
90
result = a - b;
91
break;
92
case '*':
93
result = a * b;
94
break;
95
case '/':
96
result = a / b;
97
break;
98
default:
99
break;
100
}
101
102
return result;
103
}


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

以上代码仅贡参考,如有雷同,纯属巧合.
中间还可以根据自己的需求改进~~