スタック---演算子優先アルゴリズム

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;
}
}