2025年11月9日 星期日

[227] Basic Calculator II

感覺沒有寫的很漂亮...但別人寫漂亮的我怎麼看不懂哈哈哈(大笑)
似乎一開始的定義沒有考慮好...(一直都是吧~噗)
還有忘記減法從後面減跟從前面減會不一樣~(可是怎麼會呢XD)
有一點像是,(A)-(B)+(C) 要先把它改成(A)+(-B)+(C)
才會對吧。
1-1+1 = 1
1+(-1)+1 = 1
原本想說我是stack  存下去,遇到乘除已經處理掉了,裡面只會剩加減,就從後面開始做,會變成:  
1-1+1 先做了 1+1 =2 , 存回去是2 , 1-2是負一,大錯特錯~不要來~(歪)
到底是我數學不好還是?! XD 總之先這樣子~有空再來冥想"預存下一個operator" 怎麼想
(看起來是可以一次loop結束的...)

bool isDigit(char s){
if (s-'0' >=0 && s-'0'<=9)
return true;
return false;
}
// + (-1), -(-2) *(-3),/(-4)
int calculate(char* s) {
int *stack = calloc (300000, sizeof (int));
int top = -1;
int len = strlen(s);
for (int i=0; i<len; i++){
if (s[i]=='+' || s[i]== '-')
stack[++top] = (s[i]=='+')?(-1):(-2);
else if (s[i]=='*' || s[i]== '/'){
stack[++top] = (s[i]=='*')?(-3):(-4);
}
else if (s[i]==' ')
continue;
else
{
int num = s[i]-'0';
while (i<len-1 && isDigit(s[i+1]))
{
#if 1
int last = s[++i]-'0';
num = num*10+last;
#else
num = num*10+ s[++i]-'0';
#endif
}
if (top <0 || stack[top]> -3)
stack[++top]=num;
else {
if (stack[top]== -3)
stack [--top] *= num;
else if (stack[top]== -4)
stack [--top] /= num;
}
}
}
int ret= stack[0];
for (int i=1 ; i<top; i++)
{
if (stack[i]== -1)
ret += stack[++i];
else if (stack[i]== -2)
ret -= stack[++i];
}

return ret;
}

沒有留言:

張貼留言