面试题 16.26. 计算器-栈的应用
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: “3+2*2”
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
该题很常规,解题代码如下:
int char_to_num(char *s){
long long re=0;
int i=0;
while(s[i]>='0'&&s[i]<='9'){
re=re*10+s[i]-'0';
i++;
}
// printf("re %d ",re);
return re;
}
int calculate(char* s){
int len=strlen(s);
int stack_num[len];
char stack_sign[len];
int top_num=0;
int top_sign=0;
for(int i=0;i<len;){
if(s[i]==' '){
i++;
continue;
}
if(s[i]>='0'&&s[i]<='9'){
int val=char_to_num(s+i);
stack_num[top_num++]=val;
while(s[i]>='0'&&s[i]<='9'){
i++;
}
}
else{
if(s[i]=='*'||s[i]=='/'){
int index=i;
i++;
while(s[i]==' '){
i++;
}
int nextval=char_to_num(s+i);
while(s[i]>='0'&&s[i]<='9'){
i++;
}
if(s[index]=='*'){
int val=stack_num[top_num-1]*nextval;
stack_num[top_num-1]=val;
}
else{
int val=stack_num[top_num-1]/nextval;
stack_num[top_num-1]=val;
}
}
else{
if(s[i]!='\0'){
stack_sign[top_sign++]=s[i];
i++;
}
}
}
}
top_num=0;
int p=top_sign;
top_sign=0;
while(top_sign!=p){
char sign=stack_sign[top_sign];
top_sign++;
top_num++;
if(sign=='+'){
stack_num[top_num]=stack_num[top_num-1]+stack_num[top_num];
}
else{
stack_num[top_num]=stack_num[top_num-1]-stack_num[top_num];
}
}
return stack_num[top_num];
}