表达式求值——栈实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
char stack[MAX];
int top=-1;

void fun( char a[],char b[])
{
    int i,len,j;
    len=strlen(a);
    j=-1;
    for(i=0;i<len;i++)
    {
        switch(a[i])
        {
        case '(':stack[++top]='(';break;            
        
        case '-':
        case '+':while(top>=0&&stack[top]!='(')   //当遇到"+-"时,到"("前的运算符全部出栈 
                      b[++j]=stack[top--];
                stack[++top]=' ';                //运算符进栈前先进去一个' ' 
                stack[++top]=a[i];               //运算符进栈 
                    break;
        
        case '*':
        case '/':while(top>=0&&stack[top]!='('&&stack[top]!='+'&&stack[top]!='-')
                     b[++j]=stack[top--];        //当遇到"*/"时,到"( + -"前的运算符全部出栈 
                stack[++top]=' ';
                stack[++top]=a[i];
                
                break;
        case')':while(stack[top]!='(')
                    b[++j]=stack[top--];
                top--;
                break;
        default:
                b[++j]=a[i];
                if(a[i+1]<'0'||a[i+1]>'9')
                {
                        b[++j]=' ';
                }
        }      
    }
    while(top>=0)
        b[++j]=stack[top--];
    b[++j]='';
//    for(i=0;i<=j;i++)
//        printf("%c",b[i]);
}
int compvalue(char exp[])
{
    int i,len,sum=0,c;
    top=-1;
    int digit[MAX];
    len=strlen(exp);

    for(i=0;i<len;i++)
    {
        switch( exp[i] )
        {
        case' ': break;
        case'+': sum=digit[top]+digit[top-1];
                digit[--top]=sum;
                break;
        case'-':sum=digit[top-1]-digit[top];
                digit[--top]=sum;
            
                break;
        case'*':sum=digit[top]*digit[top-1];
                digit[--top]=sum;
                break;
        case'/':sum=digit[top-1]/digit[top];
                digit[--top]=sum;
                break;
        default:
                c=0;
                while(exp[i]>='0'&&exp[i]<='9')
                {    
                    c=c*10+exp[i]-'0';
                    i++;
                }
                digit[++top]=c;
        }        
    }
    return digit[0];
}
int main()
{
    char a[MAX],b[MAX];
    scanf("%s",a);
    fun(a,b);
    printf("%s
",b);
    printf("%d
",compvalue(b));
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/cnyali/p/4163915.html