表达式计算
时间限制:1.0s 内存限制:256.0MB
问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
解题思路:1.请先看
中缀表达式转换成后缀表达式过程,转换方法参考这里
http://www.nowamagic.net/librarys/veda/detail/2307
2.大概过程是建立两个全局栈Num,C分别压入表达式的数字与符号,当遇到压入符号优先级小于等于栈顶符号优先级时(优先级:"(">"*"="/">"+"="-">")"),即栈顶永远是优先级最大的,因为遇到优先级等于小于压入栈时,就会对两个栈取值进行计算(即数字栈取两个和字符栈取一个进行计算,得出结果压入数字栈),直到栈顶符号优先级更大或者栈被取完,然后存入该符号。当输入的字符串循环完后,检查数字栈的长度如果不唯一就对两个栈取值进行计算。(所有的运算遇到栈顶为"("就会终止。)
3.大佬的画图详细描述:http://blog.csdn.net/qq_36238595/article/details/54730341
代码如下:
#include <iostream>
#include <math.h>
#include <string>
#include <vector>
#include <sstream>
#include <stack>
using namespace std;
stack<int> Num;//压入数
stack<char> C;//压入字符
string data;
bool js1(char a);
void js();
int js2(int a,int b,char c);
int main(){
int i,j;
getline(cin,data);
js();
cout<<Num.top()<<endl;
return 0;
}
//
void js(){
int i = 0;
while(i < data.size()){
//如果为数字,则计算压入Num
if(data[i] >= '0' && data[i] <= '9'){
int temp = data[i] - 48;
while(i+1 < data.size() && data[i+1] >= '0' && data[i+1] <= '9'){
temp *= 10;
temp += data[i+1] - 48;
i++;
}
Num.push(temp);
}else if(data[i] == '('){//如果是(则直接压入C
C.push('(');
}else{
while(js1(data[i])){//判断是否进行计算
int temp1 = Num.top();Num.pop();
int temp2 = Num.top();Num.pop();
char temp3 = C.top(); C.pop();
Num.push(js2(temp2,temp1,temp3));
}
if(data[i] != ')')
C.push(data[i]);
}
i++;
}
while(Num.size() != 1){
int temp1 = Num.top();Num.pop();
int temp2 = Num.top();Num.pop();
char temp3 = C.top(); C.pop();
Num.push(js2(temp2,temp1,temp3));
}
}
//传入参数,进行计算。
int js2(int a,int b,char c){
switch(c){
case '*': return a * b;
case '/': return a / b;
case '-': return a - b;
case '+': return a + b;
}
}
//判断传入字符优先级是否高于栈顶字符,并如果栈为空返回false;
bool js1(char a){
if(C.size() == 0) return false;
if(a == ')'){
switch(C.top()){
case '(': C.pop();return false;
default : return true;
}
}else if(a == '*' || a=='/'){
switch(C.top()){
case '(':return false;
case '+':return false;
case '-':return false;
default :return true;
}
}else{
switch(C.top()){
case '(':return false;
default :return true;
}
}
}