表达式求值

 

//1。若ch为数字,将后续的所有数字均依次存入数组exp中,并以字符#标志数值串结束
//2。若ch为左括号'(',则将此括号入栈op
//3。若ch为右括号')',则将栈op中'('以前的字符依次删除并存入数组exp中,然后将左括号'('删除
//4。若ch为'+'或'-', 则将栈op中'('以前的字符(运算符)依次删除并存入数组exp中,然后将ch入栈op中
//5。若ch为'*'或'/',则将当前栈op中的栈顶端连续的'*'或'/'删除,并依次存入数组exp中,然后将ch入栈op
//6。若扫描完毕,则将栈op中的所有运算符依次删除并存入数组exp中,然后再将ch存入数组exp中 
#include <iostream.h>
#define MaxSize 50
void trans(char str[], char exp[]); 
float compvalue(char exp[]); 
int main()
{
    
char str[MaxSize],exps[MaxSize];
    cout
<<"输入一个表达式:"<<endl;
    gets(str);
    cout
<<"原表达式为:"<<str<<endl; 
    trans(str,exps);
    cout
<<"后缀表达式为:"<<exps<<endl;
    cout
<<"计算结果为: "<<compvalue(exps)<<endl; 
    getchar();
    getchar();
}

void trans(char str[], char exp[])
{
     
struct 
     
{
         
char data[MaxSize];
         
int top;
     }
op;
     
char ch;
     
int i=0,t=0;
     op.top
=-1;
     ch
=str[i];
     i
++;
     
while(ch!='\0')
     
{
         
switch(ch)
         
{
             
case '(':
                 op.top
++; op.data[op.top]=ch;
                 
break;
             
case ')':
                 
while(op.data[op.top]!='(')
                 
{
                     exp[t]
=op.data[op.top];
                     op.top
--;
                     t
++;
                 }

                 op.top
--;
                 
break;
             
case '+':
             
case '-':
                 
while(op.top!=-1&&op.data[op.top]!='(')
                 
{
                     exp[t]
=op.data[op.top];
                     op.top
--;
                     t
++;
                 }

                 op.top
++; op.data[op.top]=ch;
                 
break;
             
case '*':
             
case '/':
                 
while(op.top!=-1&&(op.data[op.top]=='*'||op.data[op.top]=='/'))
                 
{
                     exp[t]
=op.data[op.top];
                     op.top
--;
                     t
++;
                 }

                 op.top
++; op.data[op.top]=ch;
                 
break;
             
case ' 'break;
             
default:
                 
while(ch>='0'&&ch<='9')
                 
{
                     exp[t]
=ch; t++;
                     ch
=str[i]; i++;
                 }

                 i
--;
                 exp[t]
='#'; t++;
             }

             ch
=str[i];i++;
         }

         
while(op.top!=-1)
         
{
             exp[t]
=op.data[op.top];
             t
++
             op.top
--;
         }

         exp[t]
='\0';
}

float compvalue(char exp[])
{
    
struct
    
{
        
float data[MaxSize];
        
int top;
    }
st;
    
float d;
    
char ch;
    
int t=0;
    st.top
=-1;
    ch
=exp[t]; t++;
    
while(ch!='\0')
    
{
        
switch(ch)
        
{
            
case '+': st.data[st.top-1]=st.data[st.top-1]+st.data[st.top];
                st.top
--break;
            
case '-': st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];
                st.top
--break;
            
case '*': st.data[st.top-1]=st.data[st.top-1]*st.data[st.top];
                st.top
--break;
            
case '/':
                
if(st.data[st.top]!=0)
                   st.data[st.top
-1]=st.data[st.top-1]/st.data[st.top];
                
else
                
{
                    cout
<<"除0出错"<<endl;
                    exit(
0);
                }

                st.top
--break;
            
default:
                d
=0;
                
while(ch>='0'&&ch<='9')
                
{
                    d
=10*d+ch-'0';
                    ch
=exp[t];
                    t
++;
                }

                st.top
++;
                st.data[st.top]
=d;
            }

            ch
=exp[t];
            t
++;
        }

        
return st.data[st.top];
}
 

posted on 2006-05-16 22:11  newzpflying  阅读(205)  评论(0)    收藏  举报