逆波蘭演算法(多位數運算)

2021-07-25 20:12:51 字數 1835 閱讀 5738

【問題描述】

在計算機中,算術表示式由常量、變數、運算子和括號組成。由於不同的運算子具有不同的優先順序,又要考慮括號,因此,算術表示式的求值不可能嚴格地從左到右進行。因而在程式設計時,借助棧實現。

【任務要求】

演算法輸入:乙個算術表示式,由常量、變數、運算子和括號組成(以字串形式輸入)。為簡化,規定運算元只能為正整數,操作符為+、-*、/,用#表示結束。

演算法輸出:表示式運算結果。

演算法要點:設定運算子棧和運算數棧輔助分析算符優先關係。在讀入表示式的字串行的同時,完成運算子和運算數的識別處理,以及相應運算。

問題分析

如果此類問題只需要計算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...