C/C++ 栈的应用:表达式求值

表达式求值(中缀->后缀)

思路

1、初始化两个栈,OPTR保存运算符,OPND保存操作数
2、从左—>右边获元素。
3、遇操作数,进栈OPND。
3、遇界限符:‘(’,入栈OPTR;‘)’,依次出栈直到遇见’(',消除一对括号。
4、遇运算符:依次取OPTR栈顶与当前运算符比较优先级:
a)、当前运算符优先级高,入栈OPTR
b)、当前运算符优先级低,出栈OPTR,依次出栈OPND右操作数、左操作数进行运算,将运算结果入栈OPND。

算符间的优先关系

在这里插入图片描述

关键代码

运算符优先级判别


/*  运算符优先级判别   */ 
char Preced( char topEmle_T, char cur_T)
{
//  topEmle_T:运算符栈顶,cur_T:当前运算符
    switch (cur_T)
    {
        case '(': return '<'; 
        case '-': case '+':             
            if ( topEmle_T=='(' ) return '<';
            else  return '>';  
        case '*': case '/': 
            if(topEmle_T=='(' || topEmle_T=='-'|| topEmle_T=='+') return '<';
            else return '>'; 
        case ')': 
            if ( topEmle_T== '(' ) return '=';
            else return '>';
        case '#':
            if ( topEmle_T== '#')  return '=';
            else return  '>';
    }
}

表达式求值


//表达式求值(后缀表达式)
void EvaluateExpression()
{
    //OP为运算符集合
    char OP[MaxSize] = {'(','+','-','*','/',')','#'};
    // 建立两个栈,OPTR:存算符,OPND:存操作数
    LinkStack_T OPTR;	LinkStack_N OPND;   
    // 初始化栈
    InitStack_T(OPTR);	InitStack_N(OPND);
    //  算符栈底放入标识符   
    Push_T(OPTR,'#');
    //  后缀表达式 
    string str=""; 
    char theta,x; // theta:操作符
    int a, b, tag;    // 左操作数,右操作数,tag标识元素入了哪个栈
    char c = getchar();
    while ( c!='#' || getTop_T(OPTR)!='#')
    {
        if(!isOperator(c,OP))
        {
            // 上一步是操作数插入栈
             if(tag==0)
            {
                Pop_N(OPND,b);
                Push_N(OPND,b*10+(c-'0'));
            }else{
                Push_N(OPND,c-'0');
            }
            tag = 0;     
            str = str + c;	// 后缀表达式
            c = getchar();
        }else{
            //如果运算符栈 栈顶元素为'#',直接插入运算符
            if(getTop_T(OPTR)=='#')
            {
                Push_T(OPTR,c);
                tag = 1;
                c = getchar();
                continue;
            }
            switch (Preced(getTop_T(OPTR),c))
            {
            case '<':
                Push_T(OPTR,c);
                tag = 1;
                c = getchar();
                break;
            case '=':
                Pop_T(OPTR,x);
                c = getchar();
                break;
            case '>':
                Pop_T(OPTR,theta);
                Pop_N(OPND,b);
                Pop_N(OPND,a);
                Push_N(OPND,Opearte(a,theta,b));
                str = str + theta;
                break;
            }
        }
    }
    cout <<"后缀表达式 = " << str << endl;
    cout <<"表达式的值 = " << getTop_N(OPND);
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值