スタック---演算子優先アルゴリズム
2239 ワード
【 3-3】 。 , 。 “ ”, 。
“ ” , 。 , (Operand)、 (Operator) (Delimiter) 。 , 。 , , 、 。 , , 、 、 、 、 , ‘#’ 。
,
(C# )
3.1 85
, , 。 :
(1) ;
(2) ;
(3) 。
。 , θ1 θ2 :
(1)θ1<θ2 θ1 θ2;
(2)θ1=θ2 θ1 θ2;
(3)θ1>θ2 θ1 θ2。
3-1 , , ‘#’ 。
3-1 θ2 + - * / ( ) # θ1 + > > < < < > > - > > < < < > > * > > > > < > > / > > > > < > > ( < < < < < = ) > > > > > > # < < < < < =
3-1 :
(1)‘#’ , ‘#’=‘#’ ;
(2) , , ‘+’ ‘+’、‘-’ ‘-’、‘+’ ‘-’ ;
(3)‘(’ , , ‘+’、‘-’、‘*’ ,‘(’=‘)’ ;‘(’ , , ‘+’、‘-’、‘*’ ;
(4)‘)’ , , ‘+’、‘-’、‘*’ ;‘)’ , , ‘+’、‘-’、‘*’ ;
(5)‘)’ ‘(’、‘#’ ‘)’、‘(’ ‘#’ , , 。
, , , OPTR, , OPND。 :
(1) OPND , ‘#’ OPTR;
(2) , OPND, , OPTR , OPTR ,
(C# )
3.1 86
OPND OPTR , OPND; OPTR , OPTR; , OPTR 。
。 , , 。
public int EvaluateExpression()
{
SeqStack<char> optr = new SeqStack <char>(20);
SeqStack<int> opnd = new SeqStack <int>(20);
optr.Push(‘#’);
char c = Console.Read();
char theta = 0;
int a = 0;
int b = 0;
while (c != ‘#’)
{
if((c!=’+’) && (c!=’-‘)
&& (c!=’*’) && (c!=’/’)
&& (c!=’(‘) && (c!=’)’))
{
optr.Push(c);
}
else
{
switch(Precede(optr.GetTop(), c))
{
Case ‘<’:
optr.Push(c);
c = Console.Read();
break;
case ‘=’:
optr.Pop();
c = Console.Read();
break;
case ‘>’:
theta = optr.Pop();
a = opnd.Pop();
b = opnd.Pop();
opnd.Push(Operate(a,theta,b));
break;
}
}