【問題描述】
在計算機中,算術表示式由常量、變數、運算子和括號組成。由於不同的運算子具有不同的優先順序,又要考慮括號,因此,算術表示式的求值不可能嚴格地從左到右進行。因而在程式設計時,借助棧實現。
【任務要求】
演算法輸入:乙個算術表示式,由常量、變數、運算子和括號組成(以字串形式輸入)。為簡化,規定運算元只能為正整數,操作符為+、-*、/,用#表示結束。
演算法輸出:表示式運算結果。
演算法要點:設定運算子棧和運算數棧輔助分析算符優先關係。在讀入表示式的字串行的同時,完成運算子和運算數的識別處理,以及相應運算。
問題分析
如果此類問題只需要計算10以內的數字運算,會非常簡單。這裡不再贅述。然而當需要計算多位數的計算時,例如123+(23-11)*113-45/3=?,當輸入為字串時,需要將表示式中運算數分離出來,並且利用負數代替其中的運算子。
本**,借助《資料結構(c語言版)》(嚴蔚敏著)書中的53頁演算法,及其中關於運算子優先順序的**。
//2017 1 2 wangran 趙海航
//這個不能計算負數
//表示式中也不要出現0
#include
#include
#include
float num[100]=;
//使用-1,-2,-3,-4,-5,-6,-7,分別代表,+,-,*,/,(,),#
//使用-1,0,1分別代表
int operate[8][8]=;
struct stacknode;
struct linkstack;
struct linkstack * initstack ()//初始化棧結構
void push(struct linkstack * s,float e)//入棧
void pop(struct linkstack *s)//出棧
float gettop(struct linkstack *s)//獲得棧頂元素
int stackempty(struct linkstack *s)//判斷是否為空棧
void getnum()//將字元轉化為整形數
else
else
if (c=='-')
else
if (c=='*')
else
if (c=='/')
else
if (c=='(')
else
if (c==')')
else
if (c=='#')
}if (temp!=0&&temp2!=0)//此處我目前只想到這麼寫,
else
if (temp==0&&temp2!=0)
}}int precede(float a,float b)//獲取a,b的優先順序
float operate(float a,float theta,float b)//對於a,b操作
}float operandtypeevaluateexperssion ()//計算函式,此演算法使用使用書中53頁
else
//switch
}}//while
return gettop(opnd);
}int main()
結果如圖:
注:
此程式關鍵地方在於getnum()函式。
多位數乘法計算
option base 1 private sub command1 click dim m as string dim n as string m trim text1.text n trim text2.text dim number1 as byte dim number2 as byte r...
彙編 多位數相加
上一次彙編寫到,只是個位數的簡單相加,只需要判斷兩者相加有無進製,進製即進一,在輸出視窗輸出一先。遇到多位數後,會變複雜很多,事實上彙編裡面可以實現相加,難題在於需要把和轉成ascii碼顯示在dos視窗。所以需要把和乙個乙個數提取,轉成ascii。程式如下 datas segment op1 dw ...
多位數運算表示式回顧
package stack public class calculate2 else if ss.isoper expression.charat index 1 else else if ss.priority ss.top ss.priority ch else index system.out...