讀取到括號時將括號內內容優先計算出來,然後取代原括號表示式的位置。
讀取到運算子時比較其與緊接的前後兩個運算子的優先順序,若均優先,進行計算,否則進行擱置。
讀取到『#』時若其緊接的前面的算術運算子為『#』則表示結束,否則對前接符號進行出棧運算。
讀取到『+』,『-』,若其前接運算子為『#』則擱置入棧,否則將其前接符號彈出運算。
讀取到』x』,』/』,若其前接運算子為『x』或』/'則將其前接符號進行出棧運算,否則擱置入棧。
讀取到『(』進行直接進行擱置入棧。
讀取到『)』,若其前接符號為『(』則將兩個符號都銷毀。否則將其前接符號出棧運算。
然後根據上面的規則,我們編寫乙個判斷運算順序的函式:
int preemption(char a,char b) //符號優先順序比較,a為當前讀入,b為棧頂元素
return c;
}
這個函式中我使用c作為反饋指令的媒介,函式返回值為c,而c的不同值代表不同的指令情況: 0.結束運算 1.彈出符號進行運算 2.符號擱置進棧 3.刪除當前元素及棧頂元素(倆括號相遇) 4.報錯(讀到無法識別的字元) 。只需要在主函式中使用乙個switch函式接受這個指令並對應執行即可。
if(*p<='9'&&*p>='0')
p++;
}
其中p是指向算術表示式的指標,p4是指向數字棧的指標
ok,大致所需要注意的事項就是這些了,下面是我的完整**:
#include #include #include int preemption(char a,char b) //符號優先順序比較,a為當前讀入,b為棧頂元素
return c;
} int main()
; char *p=str;
double *p3,*p4,a=0,b=0;
char *p1,*p2;
char stack1[20]; //符號棧 棧頂指標p2,棧底指標p1
double stack2[20]; //數字棧 棧頂指標p4,棧底指標p3
p1=p2=stack1;
p3=p4=stack2;
*p2++='#';
printf("請輸入需要計算的算術表示式:");
gets(str);
strcat(str,"#");
while(*p!='\0')
p++;
} else
break;
case 2:
*p2++=*p++;
break;
case 3:
p++;
p2--;
break;
case 4:
printf("程式讀到了無法計算的符號,出錯了\n");
p++;
break;}}
} return 0;
}
乙個計算器的C語言實現
今天在讀 編譯原理及實踐 時。看到了乙個簡單的整數計算器的實現。依照書上的思路,我略微進行了擴充套件 1 從整數計算器擴充套件到小數計算器。2 支援除法 3 支援空字元。執行效果例如以下 非常easy,例如以下 cal.c include include char token double exp ...
C語言實現乙個矩陣乘法計算器
雖然一般做練習題的時候具體的矩陣最多四階左右,但是作為實現該功能的 最好不要侷限於此。由於矩陣乘法的運算要求,第二個矩陣的行數必須與第乙個矩陣的列數相等,且兩個矩陣的行列數均不可小於或等於0,該演算法會先要求輸入第乙個矩陣的行數與列數,然後按行輸入矩陣的元素,接著輸入第二個矩陣的行數與列數,判斷是否...
C 實現乙個簡單的計算器
乙個用堆和棧實現的簡單計算器,可以進行非負數之間的加減乘除運算 可以是個位數也可以是多位數 這個計算器就是用棧和佇列進行乙個手算過程的模擬,也不算難 下面是 include include include include include using namespace std int main if...