BUAA OJ 722 Gzh之表達式求值


題目描述

時間限制: 1000 ms 內存限制: 65536 kb
如題,給你個數學表達式,求值。

輸入

多組輸入數據,每組數據為一行字符串(長度小於100)。輸入只包含整數(32位int范圍內) , ‘+’ ,’-’ ,’‘, ‘/’ , ‘(’ , ‘)’ , ‘%’, ‘*‘。(兩個乘號為乘方,具有最高優先級)

輸入數據保證運算合法, 保證不會出現除乘方外兩個運算符連續出現的情況(比如”++1”),不會出現小數。

輸出

對於每組數據,輸出一行,表達式的值。

輸入樣例

1+1

輸出樣例

2
#include <cstdio>
#include <string>
#include <cctype>
#include <cmath>
#include <iostream>
using namespace std;
const int N_OPTR=9;
typedef long long ll;

enum thePri{lessThen=1,Equal,moreThen};

//運算符優先等級 [棧頂] [當前]
const int pri[N_OPTR][N_OPTR]={
/* |-------------- 當 前 運 算 符 -----------| */
/* + - * / ( ) % ** \0 */
/* -- + */ 3, 3, 1, 1, 1, 3, 1, 1, 3,
/* | - */ 3, 3, 1, 1, 1, 3, 1, 1, 3,
/* 棧 * */ 3, 3, 3, 3, 1, 3, 3, 1, 3,
/* 頂 / */ 3, 3, 3, 3, 1, 3, 3, 1, 3,
/* 符 ( */ 1, 1, 1, 1, 1, 2, 1, 1, 4,
/* | ) */ 4, 4, 4, 4, 4, 4, 4, 4, 4,
/* | % */ 3, 3, 3, 3, 1, 3, 3, 1, 4,
/* | ** */ 3, 3, 3, 3, 1, 3, 3, 3, 4,
/* -- \0 */ 1, 1, 1, 1, 1, 4, 1, 1, 2
};

struct stack{
ll data[110];
int size=0;
bool empty(){
return !size;
}
void pop(){
if(size)
size--;
}
ll top(){
return data[size-1];
}
void clear(){
size=0;
}
void push(ll num){
data[size++]=num;
}
};

string con;
stack nums,ops;
int pos;

// 加 減 乘 除 左 右 取余 乘方 終止
enum theOperater {ADD=0,SUB,MUL,DIV,LBR,RBR,DEL,POW,EOE};

ll readNum(){
ll tem;
bool addSymbol;
if(isdigit(con[pos])) {
tem = con[pos] - '0';
nums.push(tem);
addSymbol=false;
pos++;
}
else{
addSymbol=true;
nums.push(con[++pos] - '0');
pos++;
}
while(isdigit(con[pos])){
tem=nums.top();nums.pop();
nums.push(tem*10+(con[pos]-'0'));
pos++;
}
if(addSymbol){
tem=nums.top();nums.pop();
tem*=(-1);
nums.push(tem);
}
pos--;
return tem;
}

theOperater readOp(){
switch(con[pos]){
case '+': return ADD;
case '-': return SUB;
case '*':
if(con[pos+1]=='*') {
++pos;
return POW;
}
else
return MUL;
case '/': return DIV;
case '(': return LBR;
case ')': return RBR;
case '%': return DEL;
default: exit(-1);
}
}

ll calcu (ll a,theOperater op,ll b ) {
switch ( op ) {
case ADD : return a + b;
case SUB : return a - b;
case MUL : return a * b;
case DIV : return a/b;
case DEL : return a%b;
case POW : return (ll)pow(a,b);
default : exit ( -1 );
}
}

int main(){
while(cin>>con){
//init
nums.clear();
ops.clear();
ops.push(EOE);

int size=(int)con.size();
for(pos=0;!ops.empty();pos++){
if(pos<size&&
(isdigit(con[pos])
||(pos<size-1&&pos>0&&con[pos-1]=='('&&con[pos]=='-'&&isdigit(con[pos+1])))){
readNum();
} else {
if(pos<size){
theOperater op=readOp();
theOperater onTop=(theOperater)ops.top();
switch(pri[onTop][op]){
case lessThen :
ops.push(op);
break;
case Equal :
ops.pop();
break;
case moreThen:{
--pos;ops.pop();
ll num2=nums.top();nums.pop();
ll num1=nums.top();nums.pop();
nums.push(calcu(num1,onTop,num2));
}
break;
default : exit ( -1 );
}
}else{
theOperater onTop=(theOperater)ops.top();ops.pop();
if(onTop!=EOE){
ll num2=nums.top();nums.pop();
ll num1=nums.top();nums.pop();
nums.push(calcu(num1, onTop, num2));
}
}
}
}
cout<<nums.top()<<'\n';
}
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com