这道题很明显和之前做的逆波兰表达式(见leecodeLCR036逆波兰表达式)就是一个模子里刻出来的题,都是利用栈进行表达式的计算
BUT这道题和我们自己之前写的不一样的地方在于对输入的特殊处理——尤其是因为在这里我们需要自己对输入进行处理
原本我想一次性将所有(不管是运算符号还是数字字符)以字符串的形式先进行读取,读取完毕之后将数字字符串转换为整型数字但是由于.还有运算符之间并没有进行分隔开来,注定我们只能使用getchar“逐字逐句”地进行读取
进行读取之后我们先要进行判断——是数字还是运算符,数字的话就将他加投入到数字之中直至遇到.为止——说明当前数字读取完毕——>放入数字的栈之中进行暂时的存储
因为使用的是getchar进行单个字符的读取,所以我们在读取的同时可以将栈中数据拿出进行计算,不需要再编写函数
#include<stdio.h>
#include<stdlib.h>
int stack[1000];
int top=0;
int main(){
char buf;
int num=0;
while((buf=getchar())!='@'){
//首先要进行读取,读取时字符串当中的点是关键
if(buf>='0'&&buf<='9'){//注意读到0的情况,不要把0给忘了
num=num*10+(buf-'0');
}
else if(buf=='.'){
// printf("%d\n",num);
stack[top++]=num;
num=0;
}
else if(buf=='+'){
int num2=stack[--top];
int num1=stack[--top];
stack[top++]=num1+num2;
// printf("%d\n",stack[top-1]);
}
else if(buf=='-'){
int num2=stack[--top];
int num1=stack[--top];
stack[top++]=num1-num2;
// printf("%d\n",stack[top-1]);
}
else if(buf=='*'){
int num2=stack[--top];
int num1=stack[--top];
stack[top++]=num1*num2;
// printf("%d\n",stack[top-1]);
}
else if(buf=='/'){
int num2=stack[--top];
int num1=stack[--top];
stack[top++]=(num1/num2);
// printf("%d\n",stack[top-1]);
}
}
printf("%d",stack[--top]);
}