//using System;
class Class1
{
public static void Main()
{
System.Console.WriteLine("Hello World!");
//中綴 => 後綴表達式
string s = "( 1.9 +(20 +41)/ (25*11) -3 ) * 2"; //中綴; //中綴
string S = ""; //後綴
char[] Operators = new char[s.Length];
int Top = -1;
for (int i = 0; i < s.Length; i++)
{
char C = s[i];
switch (C)
{
case ' ': //忽略空格
break;
case '+': //操作符
case '-':
while (Top >= 0) //棧不爲空時
{
char c = Operators[Top--]; //pop Operator
if (c == '(')
{
Operators[++Top] = c; //push Operator
break;
}
else
{
S = S + c;
}
}
Operators[++Top] = C; //push Operator
S += " ";
break;
case '*': //忽略空格
case '/':
while (Top >= 0) //棧不爲空時
{
char c = Operators[Top--]; //pop Operator
if (c == '(')
{
Operators[++Top] = c; //push Operator
break;
}
else
{
if (c == '+' || c == '-')
{
Operators[++Top] = c; //push Operator
break;
}
else
{
S = S + c;
}
}
}
Operators[++Top] = C; //push Operator
S += " ";
break;
case '(':
Operators[++Top] = C;
S += " ";
break;
case ')':
while (Top >= 0) //棧不爲空時
{
char c = Operators[Top--]; //pop Operator
if (c == '(')
{
break;
}
else
{
S = S + c;
}
}
S += " ";
break;
default:
S = S + C;
break;
}
}
while (Top >= 0)
{
S = S + Operators[Top--]; //pop Operator
}
System.Console.WriteLine(S); //後綴
//後綴表達式計算
double[] Operands = new double[S.Length];
double x, y, v;
Top = -1;
string Operand = "";
for (int i = 0; i < S.Length; i++)
{
char c = S[i];
if ((c >= '0' && c <= '9') || c == '.')
{
Operand += c;
}
if ((c == ' ' || i == S.Length - 1) && Operand != "") //Update
{
Operands[++Top] = System.Convert.ToDouble(Operand); //push Operands
Operand = "";
}
if (c == '+' || c == '-' || c == '*' || c == '/')
{
if ((Operand != ""))
{
Operands[++Top] = System.Convert.ToDouble(Operand); //push Operands
Operand = "";
}
y = Operands[Top--]; //pop 雙目運算符的第二操作數 (後進先出)注意操作數順序對除法的影響
x = Operands[Top--]; //pop 雙目運算符的第一操作數
switch (c)
{
case '+':
v = x + y;
break;
case '-':
v = x - y;
break;
case '*':
v = x * y;
break;
case '/':
v = x / y; // 第一操作數 / 第二操作數 注意操作數順序對除法的影響
break;
default:
v = 0;
break;
}
Operands[++Top] = v; //push 中間結果再次入棧
}
}
v = Operands[Top--]; //pop 最終結果
System.Console.WriteLine(v);
System.Console.ReadLine();
}
}
數據結構之應用"棧(Stack)"實現: 解析算術表達式及計算
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.