时间限制:1秒 内存限制:128M
题目描述
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
输入描述
输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 +
和乘法运算符 *
,且没有括号,所有参与运算的数字均为0 到 2^31-1 之间的整数。输入数据保证这一行只有 0~ 9、+、*这 12 种字符。
输出描述
输出只有一行,包含一个整数,表示这个表达式的值。
样例
输入
1+1*3+4
输出
8
提示
对于 30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;
对于 80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;
对于 100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。
// 表达式求值
// 将中缀表达式转成后缀表达式
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;
char a[100005]; // 存储后缀表达式
int in=0;
// 定义栈
char stack1[100005]; // 存储操作符
int top1=-1;
// 定义栈
int stack2[100005]; // 存储后缀表达式的数字及计算得到的数字
int top2=-1;
int main() {
string s;
cin>>s;
// 遍历中缀表达式
for(int i=0; i<s.length(); i++) {
// 1、操作符 2、操作数
if(s[i]>='0'&& s[i]<='9') {
a[in++]=s[i];
while(s[i+1]>='0' && s[i+1]<='9') {
a[in++]=s[i+1];
i++;
}
a[in++]=' ';
} else {
// 1.1 栈空,操作符进栈
if(top1==-1) {
stack1[++top1]=s[i];
} else {
// 1.2 优先级大于栈顶操作符,操作符进栈
if(stack1[top1]='+' && s[i]=='*') {
stack1[++top1]=s[i];
}
// 1.3 优先级不大于栈顶操作符,栈顶操作符依次出栈,操作符进栈
if(s[i]=='+') {
while(top1!=-1) {
a[in++]=stack1[top1--];
a[in++]=' ';
}
stack1[++top1]=s[i];
}
}
}
}
// 栈不为空,操作符放依次出栈输出
while(top1!=-1) {
a[in++]=stack1[top1--];
a[in++]=' ';
}
// cout<<strlen(a)<<endl; // 6
// 遍历后缀表达式
for(int i=0; i<strlen(a); i++) {
// 1、操作符 2、操作数
if(a[i]=='+') {
// 1.1 元素出栈
int r=stack2[top2--]; // 栈顶元素作为右操作数
int l=stack2[top2--]; // 栈顶元素作为左操作数
// 1.2 结果入栈
int res=l+r;
stack2[++top2]=res;
} else if(a[i]=='*') {
// 1.1 元素出栈
int r=stack2[top2--]; // 栈顶元素作为右操作数
int l=stack2[top2--]; // 栈顶元素作为左操作数
// 1.2 结果入栈
int res=l*r;
stack2[++top2]=res;
} else {
// 2.1 获取数字
int sum=0;
while(a[i]!=' ') {
sum=sum*10+a[i]-'0';
i++;
}
// 2.2 数字入栈
stack2[++top2]=sum;
}
}
// 输出栈顶元素,即表达式的值
cout<<stack2[top2]<<endl; // 3 答案错误
return 0;
}
理解过程:
由中缀表达式画出二叉树,最后做的运算在最顶层
后序遍历二叉树得到后缀表达式,前序遍历二叉树得到前缀表达式
+
+ 4
1 *
1 3
中缀表达式:1+1*3+4
后缀表达式:113*+4+
前缀表达式:++1*134
问题:
数组a用来存储后缀表达式,每个操作数、操作符中间用空格隔开
理论存储的是 {'1' ,' ', '1', ' ', '3', ' ', '*', ' ', '+', ' ', '4', ' ', '+', ' '} // strlen(a)=14
实际存储的是 {'1' ,' ', '1', ' ', '3', ' ', '\000', ' ', '\001', ' ', '4', ' ', '+', ' '} // strlen(a)=6
不知道为什么本应该存储 *
变成了 '\000',存储 +
变成了 '\001' ??
Dev C++ Debug,一开始栈空,stack1存的是 +
,当 *
进栈的时候,原来栈中的 +
就变成了 '\000',新入栈的 *
存成了 '\001' 这是什么原因导致的??