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();
输入
第一个输入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;
}
标签:OPND,--,top,opnd,tempdata,堆栈,include,DS,optr 来源: https://blog.csdn.net/Galaxy_Su/article/details/120517224