E. DS堆栈--表达式计算【S】

题目描述

计算一个表达式的运算结果

使用C++自带stack堆栈对象来实现

参考课本的算法伪代码P53-54

例如

1. Push (OPTR, '#');表示把字符#压入堆栈OPTR中,转换成c++代码就是OPTR.push('#');

2. Pop(OPND, a); 表示弹出栈OPND的栈顶元素,并把栈顶元素放入变量a中。因此改成c++代码是两个操作:

a = OPND.top();   OPND.pop();

3. a = GetTop(OPND)表示获取栈OPND的栈顶元素,转成c++代码就是: a = OPND.top();

E. DS堆栈--表达式计算【S】

E. DS堆栈--表达式计算【S】 

 E. DS堆栈--表达式计算【S】

输入

第一个输入t,表示有t个实例

第二行起,每行输入一个表达式,每个表达式末尾带#表示结束

输入t行

输出

每行输出一个表达式的计算结果,计算结果用浮点数(含4位小数)的格式表示

用cout控制浮点数输出的小数位数,需要增加一个库文件,并使用fixed和setprecision函数,代码如下:

#include <iostream>
#include<iomanip>
using namespace std;

int main()

{ double temp = 12.34

cout<<fixed<<setprecision(4)<<temp<<endl;

}

//输出结果为12.3400

 

样例输入

2
1+2*3-4/5#
(66+(((11+22)*2-33)/3+6)*2)-45.6789#

样例输出

6.2000
54.3211

CODE

#include "iostream"
#include "string"
#include "cstdlib"
#include "cstring"
#include "iomanip"
#include "stack"
#define OPSETSIZE 7
using namespace std;

char prior[7][7] = {'>','>','<','<','<','>','>',
                    '>','>','<','<','<','>','>',
                    '>','>','>','>','<','>','>',
                    '>','>','>','>','<','>','>',
                    '<','<','<','<','<','=',' ',
                    '>','>','>','>',' ','>','>',
                    '<','<','<','<','<',' ','='};
double Operator(double a,unsigned char thera,double b){
    if(thera=='+'){
        return a+b;
    }
    if(thera=='-'){
        return b-a;
    }
    if(thera=='*'){
        return a*b;
    }
    if(thera=='/'){
        return b/a;
    }
}

char opset[OPSETSIZE]={'+','-','*','/','(',')','#'};
int In(char test,char *testop){
    for(int i=0;i<7;i++){
        if(test==testop[i]){
            return 1;
        }
    }
    return 0;
}

char precede(char aop,char bop){
    int a,b;
    for(int i=0;i<7;i++){
        if(aop==opset[i]){
            a=i;
        }
        if(bop==opset[i]){
            b=i;
        }
    }
    return prior[a][b];
}

float evaluateexpression(string myexp){
    stack<char> optr;
    stack<double> opnd;
    char tempdata[20];
    double data,a,b,r;
    char theta,dr[2];
    char c;
    int i=0;
    optr.push('#');
    c=myexp[0];
    strcpy(tempdata,"\0");
    while(c!='#' || optr.top()!='#'){
        if(!In(c,opset)){
            dr[0]=c;
            dr[1]='\0';
            strcat(tempdata,dr);
            c=myexp[++i];
            if(In(c,opset)){
                data=(float) atof(tempdata);
                opnd.push(data);
                strcpy(tempdata,"\0");
            }
        }
        else{
            switch (precede(optr.top(),c)) {
                case '<':
                    optr.push(c);
                    c=myexp[++i];
                    break;
                case '=':
                    optr.pop();
                    c=myexp[++i];
                    break;
                case '>':
                    theta=optr.top();
                    optr.pop();
                    a=opnd.top();
                    opnd.pop();
                    b=opnd.top();
                    opnd.pop();
                    opnd.push(Operator(a,theta,b));
                    break;
            }
        }
    }
    return opnd.top();
}

int main(){
//    freopen("123.in","r",stdin);
    string exp;
    int t;
    double result;
    cin>>t;
    while (t--){
        cin>>exp;
        result=evaluateexpression(exp);
        cout<< fixed<< setprecision(4)<<result<<endl;
    }
    return 0;
}

上一篇:汇编语言_段地址寄存器ES的使用


下一篇:Mac删除讨厌的.DS_Store文件夹