四则运算(C#版)
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
}
/// <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; //计算数115
int b = 0; //计算数216
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
else26
{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
}以上代码仅贡参考,如有雷同,纯属巧合.
中间还可以根据自己的需求改进~~


浙公网安备 33010602011771号