表达式求值(C/C++)

题目:
 
利用栈编写表达式求值程序:输入含有“+”、“-”、“*”、“/”四则运算的表达式,其中负数要用(0-正数)表示,并以=结束。要求输出表达式的值。



输入格式

第一行:一个算术表达式


输出格式

第一行:算术表达式的值


输入样例

3*(9-7)=


输出样例

6
 
代码:
 
#include<stdio.h>
#include<iostream>
#include<stack>
using namespace std;
int In(char ch)   // 判断是否为字母
{
    if(ch>=48&&ch<=57)   return 1;
    else   return 0;
}
char compare(char a,char b)  // 比较两个符号的优先顺序
{
    int i,j;
    char c[7]=  {'+','-','*','/','(',')','#'};
    char d[7][7]= {   
                {'>','>','<','<','<','>','>'},
                {'>','>','<','<','<','>','>'},
                {'>','>','>','>','<','>','>'},
                {'>','>','>','>','<','>','>'},
                {'<','<','<','<','<','=','@'},
                {'>','>','>','>','@','>','>'},
                {'<','<','<','<','<','@','='},
    };
    if(b=='=') return '>';
    for(i=0; c[i]!=a; i++);
    for(j=0; c[j]!=b; j++);
    return d[i][j];
}
int claculat(int a,char op,int b)  //  计算表达式,注意计算顺序与栈的关系
{
    int m;
    if(op=='+')      m=a+b;
    if(op=='-')   m=a-b;
    if(op=='*')   m=a*b;
    if(op=='/')   m=a/b;
    return m;
}
int main()
{
    stack<int> OPND;  // 数字栈,用于存储数据
    stack<char> OPTR; // 符号栈, 用于存储计算符号
    char c, top, op;
    int temp,m,n, result;
    c = getchar();
    OPTR.push('#');  // 一开始时,符号栈中并没有符号,而在接下来的循环中,需要比较两个运算符号的优先顺序,
			// 所以有必要先在符号栈中存入一个符号,而这个符号的运算级别必须小于其他符号。
    while(c!='='||OPTR.top()!='#') {   // 输入‘=’, 则退出循环。 
        if(In(c)) {   // 输入数字,一个一个数字输入,转化为正确的数值,并存入数字栈
            temp=c-'0';
            c=getchar();
            while(In(c)) {
                temp=temp*10+c-'0';
                c=getchar();
            }
            OPND.push(temp);
        }


        else {   
            top = OPTR.top();
            switch (compare(top , c)) {
            case '<':   			//若运算极较小, 则入栈
                OPTR.push(c);
                c = getchar();
                break;
            case '=':                      //若运算级别相等(为两个括号) 则出栈
                OPTR.pop();
                c = getchar();
                break;
            case '>':			// 若运算级别较大,则数字栈出栈,计算两个数字的算术结果,并存入栈中
                m = OPND.top();
                OPND.pop();
                n = OPND.top();
                OPND.pop();
                op = OPTR.top();
                OPTR.pop();
                result = claculat(n, op, m);
                OPND.push(result);
                break;
            }
        }
    }
    printf("%d\n",OPND.top());
    return 0;
}
 
 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值