使用棧來實現含括號的四則運算,複雜的就是各種分支的判斷,當時參考了很多前輩的**,又自己敲了很久,得到乙個最終版,在此記錄一下,希望若干年後的自己看到時能夠不忘初心。
#include#include/*資料棧*/
struct shuju ;
/*符號棧*/
struct fuhao ;
void initoperatenum(struct shuju *stacknum)
void initoperatesymbol(struct fuhao *stacksymbol)
/*存入資料棧*/
void inshuju(struct shuju *stacknum, int num)
/*存入符號棧*/
void infuhao(struct fuhao *stacksymbol, char ch)
/*讀取資料棧*/
int readshuju(struct shuju *stacknum)
/*讀取符號棧*/
char readfuhao(struct fuhao *stacksymbol)
/*從資料棧取出資料*/
int putshuju(struct shuju *stacknum)
/*從符號棧取出符號*/
char putfuhao(struct fuhao *stacksymbol)
/*符號優先順序判斷*/
int judge(char ch)
if(ch == '+' || ch == '-')
else if(ch == '*' || ch == '/')
else if(ch == ')')
}/*四則運算*/
int math(float v1, float v2, char c)
case '-' :
case '*' :
case '/' :
}return sum;
}void manu()
int main()
; char *str = (char *)malloc(sizeof(char)*200);
while((c = getchar()) != '\n')
str[i] = '\0';
for(i = 0; str[i] != '\0'; i ++)
else if(str[i] == '(' && str[i+1] == '-')
inshuju(&data, atoi(v));
while(t > 0)
if(str[i] != ')')
}else if(str[i] >= '0' && str[i] <= '9')
inshuju(&data, atoi(v));
while(t > 0)
i --;
}else
else if(judge(str[i]) == 1)
else if(judge(str[i]) == 2)
else if(judge(readfuhao(&symbol)) == 2)
infuhao(&symbol, str[i]); //新符號進棧
}else if(judge(readfuhao(&symbol)) == 3)
infuhao(&symbol, str[i]); //新符號進棧
}/*棧頂符號不可能是')',故不做判斷*/
}else if(judge(str[i]) == 3)
else if(judge(readfuhao(&symbol)) == 2)
else if(judge(readfuhao(&symbol)) == 3)
infuhao(&symbol, str[i]); //新符號進棧}}
else if(judge(str[i]) == 4) while(judge(readfuhao(&symbol)) != 1);
putfuhao(&symbol); //括號內運算結束後使'('出棧
} }}
free(str); //釋放記憶體空間
while(symbol.top != -1)
printf("%.2f\n", data.data[0]);
}return 0;
}
含括號的四則運算
總體思路 需要用到棧,從中綴表示式到字尾表示式,再把字尾表示式轉化為結果,比如計算9 3 1 5 4 2,這個式子就叫做中綴表示式,然後我們需要把它轉化成字尾表答式,方法 將中綴表示式從左到右讀取,如果是數字,直接輸出到字尾表示式,如果是字元,則如果是右括號,把從棧頂開始到棧中左括號的字元輸出到字尾...
四則運算(含括號)C
輸入乙個表示式 用字串表示 求這個表示式的值。保證字串中的有效字元包括 0 9 且表示式一定合法。資料範圍 表示式計算結果和過程中滿足 val le 1000 val 1000,字串長度滿足 1 le n le 1000 1 n 1000 輸入乙個算術表示式 得到計算結果 輸入 3 2 輸出 25 ...
C C 帶括號四則運算
1 首先從string讀入表示式,取出每乙個字元後裝入deque容器coll1中 原始碼在後面 2 從該容器取出每乙個元素,利用棧將中綴表示式轉換成字尾表示式 可參考 將字尾表示式裝入容器coll3中。3 最後從coll3中取出元素逐一處理,既使用逆波蘭式求值 如下圖 c 原始碼 可編譯並正常執行,...