#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
char data[5];//運算元 1234..........
char opstack[5];//放運算子
int top=-1,optop=-1;//top紀錄運算元堆疊、optop紀錄運算子堆疊
char oppop(){
char sym;
sym=opstack[optop];
optop--;
return sym;
}
void oppush(char strstack){
opstack[++optop]=strstack;
}
//上方是運算子、下方是運算元
int pop(){
int num;
num=data[top]-'0';
top=top-1;
return num;
}
void push(char strdata){
data[++top]=strdata;
}
int main(int argc, char *argv[]) {
char str[25];
int f=0,i=0;//f為旗標
char token='\0';
int ans,length;
printf("字串=%s ; 長度=%d \n",str
,length
); printf("-----------------------\n");
while(f==0){
if(str[i]>='0'&& str[i]<='9'){//若是數字丟入運算元陣列
push(str[i]);
i++;//i計算算式字串位置
continue;
}else if(str[i]=='*' || str[i]=='/' || str[i]=='+' || str[i]=='-'){
if(str[i]=='+' || str[i]=='-'){//若是運算子,先判斷optop運算子堆疊是否有內容
if(optop>=0){//有內容才判斷優先權
if(opstack[optop]=='*' || opstack[optop]=='/'){
token=oppop();
switch(token){
case '*':
ans=pop()*pop();
push(ans);
break;
case '/':
ans=pop()/pop();
push(ans);
break;
}
oppush(str[i]);
i++;
}else{//若堆疊內運算子是+-則直接放入
oppush(str[i]);
i++;
}
}else{//運算子堆疊無內容直接放入
oppush(str[i]);
i++;
}
}else{//判斷*/優先權
if(optop>=0){//同上方
if(opstack[optop]=='*' || opstack[optop]=='/'){
token=oppop();
switch(token){
case '*':
ans=pop()*pop();
push(ans);
break;
case '/':
ans=pop()/pop();
push(ans);
break;
}
oppush(str[i]);
i++;
}else{
oppush(str[i]);
i++;
}
}else{
oppush(str[i]);
i++;
}
}
}else{
f=1;
}
}
while(optop>=0){//最後拿出剩下的運算元堆疊與運算子堆疊倆倆運算
token=oppop();
switch(token){
case '+':
ans=pop()+pop();
push(ans);
break;
case '-':
ans=pop()+pop();
push(ans);
break;
case '*':
ans=pop()*pop();
push(ans);
break;
case '/':
ans=pop()/pop();
push(ans);
break;
default:
ans=pop();
break;
}
optop--;
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCi8qIHJ1biB0aGlzIHByb2dyYW0gdXNpbmcgdGhlIGNvbnNvbGUgcGF1c2VyIG9yIGFkZCB5b3VyIG93biBnZXRjaCwgc3lzdGVtKCJwYXVzZSIpIG9yIGlucHV0IGxvb3AgKi8KCmNoYXIgZGF0YVs1XTsvL+mBi+eul+WFgyAxMjM0Li4uLi4uLi4uLiAKY2hhciBvcHN0YWNrWzVdOy8v5pS+6YGL566X5a2QIAppbnQgdG9wPS0xLG9wdG9wPS0xOy8vdG9w57SA6YyE6YGL566X5YWD5aCG55aK44CBb3B0b3DntIDpjITpgYvnrpflrZDloIbnloogCgpjaGFyIG9wcG9wKCl7CgljaGFyIHN5bTsKCXN5bT1vcHN0YWNrW29wdG9wXTsKCW9wdG9wLS07CglyZXR1cm4gc3ltOwp9Cgp2b2lkIG9wcHVzaChjaGFyIHN0cnN0YWNrKXsKCW9wc3RhY2tbKytvcHRvcF09c3Ryc3RhY2s7Cn0KLy/kuIrmlrnmmK/pgYvnrpflrZDjgIHkuIvmlrnmmK/pgYvnrpflhYMgCmludCBwb3AoKXsKCWludCBudW07CgludW09ZGF0YVt0b3BdLScwJzsKCXRvcD10b3AtMTsKCXJldHVybiAgbnVtOwp9Cgp2b2lkIHB1c2goY2hhciBzdHJkYXRhKXsKCWRhdGFbKyt0b3BdPXN0cmRhdGE7Cn0KCgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewoJY2hhciBzdHJbMjVdOwoJaW50IGY9MCxpPTA7Ly9m54K65peX5qiZIAoJY2hhciB0b2tlbj0nXDAnOwoJaW50IGFucyxsZW5ndGg7CiAgICAKICAgIHB1dHMoIuiri+i8uOWFpeWtl+S4su+8miIpOwogICAgZ2V0cyhzdHIpOwogICAgbGVuZ3RoID0gc3RybGVuKHN0cik7CiAgICBwdXRzKCLovLjlhaXnmoTlrZfkuLLngrrvvJoiKTsKICAgIHByaW50Zigi5a2X5LiyPSVzIDsg6ZW35bqmPSVkIFxuIixzdHIsbGVuZ3RoKTsKICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgCiAgICB3aGlsZShmPT0wKXsKICAgIAlpZihzdHJbaV0+PScwJyYmIHN0cltpXTw9JzknKXsvL+iLpeaYr+aVuOWtl+S4n+WFpemBi+eul+WFg+mZo+WIlyAKICAgIAkJcHVzaChzdHJbaV0pOwogICAgCQlpKys7Ly9p6KiI566X566X5byP5a2X5Liy5L2N572uIAogICAgCQljb250aW51ZTsKCQl9ZWxzZSBpZihzdHJbaV09PScqJyB8fCBzdHJbaV09PScvJyB8fCBzdHJbaV09PScrJyB8fCBzdHJbaV09PSctJyl7CgkJCWlmKHN0cltpXT09JysnIHx8IHN0cltpXT09Jy0nKXsvL+iLpeaYr+mBi+eul+WtkO+8jOWFiOWIpOaWt29wdG9w6YGL566X5a2Q5aCG55aK5piv5ZCm5pyJ5YWn5a65IAoJCQkJaWYob3B0b3A+PTApey8v5pyJ5YWn5a655omN5Yik5pa35YSq5YWI5qyKIAoJCQkJCWlmKG9wc3RhY2tbb3B0b3BdPT0nKicgfHwgb3BzdGFja1tvcHRvcF09PScvJyl7CgkJCQkJCXRva2VuPW9wcG9wKCk7CgkJCQkJCXN3aXRjaCh0b2tlbil7CgkJCQkJCQljYXNlICcqJzoKCQkJCQkJCQlhbnM9cG9wKCkqcG9wKCk7CgkJCQkJCQkJcHVzaChhbnMpOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnLyc6CgkJCQkJCQkJYW5zPXBvcCgpL3BvcCgpOwoJCQkJCQkJCXB1c2goYW5zKTsKCQkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlvcHB1c2goc3RyW2ldKTsJCgkJCQkJCWkrKzsJCgkJCQkJfWVsc2V7Ly/oi6XloIbnlorlhafpgYvnrpflrZDmmK8rLeWJh+ebtOaOpeaUvuWFpSAKCQkJCQkJb3BwdXNoKHN0cltpXSk7CgkJCQkJCWkrKzsKCQkJCQl9CQoJCQkJfWVsc2V7Ly/pgYvnrpflrZDloIbnlornhKHlhaflrrnnm7TmjqXmlL7lhaUgCgkJCQkJCW9wcHVzaChzdHJbaV0pOwoJCQkJCQlpKys7CgkJCQkJfQkKCQkJfWVsc2V7Ly/liKTmlrcqL+WEquWFiOasiiAKCQkJCWlmKG9wdG9wPj0wKXsvL+WQjOS4iuaWuSAKCQkJCQlpZihvcHN0YWNrW29wdG9wXT09JyonIHx8IG9wc3RhY2tbb3B0b3BdPT0nLycpewoJCQkJCQl0b2tlbj1vcHBvcCgpOwoJCQkJCQlzd2l0Y2godG9rZW4pewoJCQkJCQkJY2FzZSAnKic6CgkJCQkJCQkJYW5zPXBvcCgpKnBvcCgpOwoJCQkJCQkJCXB1c2goYW5zKTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJy8nOgoJCQkJCQkJCWFucz1wb3AoKS9wb3AoKTsKCQkJCQkJCQlwdXNoKGFucyk7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJb3BwdXNoKHN0cltpXSk7CQoJCQkJCQlpKys7CQoJCQkJCX1lbHNlewoJCQkJCQlvcHB1c2goc3RyW2ldKTsKCQkJCQkJaSsrOwoJCQkJCX0KCQkJCX1lbHNlewoJCQkJCQlvcHB1c2goc3RyW2ldKTsKCQkJCQkJaSsrOwoJCQkJCX0JCgkJCX0JCgkJfWVsc2V7CgkJCWY9MTsKCQl9Cgl9CgkKCXdoaWxlKG9wdG9wPj0wKXsvL+acgOW+jOaLv+WHuuWJqeS4i+eahOmBi+eul+WFg+WghueWiuiIh+mBi+eul+WtkOWghueWiuWAhuWAhumBi+eulyAKCQl0b2tlbj1vcHBvcCgpOwoJCXN3aXRjaCh0b2tlbil7CgkJCWNhc2UgJysnOgoJCQkJYW5zPXBvcCgpK3BvcCgpOwoJCQkJcHVzaChhbnMpOwoJCQkJYnJlYWs7CgkJCWNhc2UgJy0nOgoJCQkJYW5zPXBvcCgpK3BvcCgpOwoJCQkJcHVzaChhbnMpOwoJCQkJYnJlYWs7CgkJCWNhc2UgJyonOgoJCQkJYW5zPXBvcCgpKnBvcCgpOwoJCQkJcHVzaChhbnMpOwoJCQkJYnJlYWs7CgkJCWNhc2UgJy8nOgoJCQkJYW5zPXBvcCgpL3BvcCgpOwoJCQkJcHVzaChhbnMpOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlhbnM9cG9wKCk7CgkJCQlicmVhazsKCQl9CgkJb3B0b3AtLTsKCX0KCQoJcHJpbnRmKCLnrZTmoYjmmK8lZCBcbiIsYW5zKTsKCQogICAgCiAgICAKCXJldHVybiAwOwp9