7 棧應用 加減乘數計算器

2021-10-05 11:39:42 字數 1857 閱讀 7761

1 首先分為兩個棧:數棧和操作符棧(簡稱符棧)

2 定義index變數,用於遍歷字串「6+1*2」

3 如果當前遍歷的字元是數字,直接入數棧

4 如果當前遍歷的字元是操作符,分為兩種情況:

4.1 如果符棧為空,直接將操作符放入符棧;

4.2 如果符棧不為空,又分為兩種情況:

4.2.1 如果當前操作符a的優先順序小於或者等於符棧頂操作符的優先順序,則符棧pop出乙個操作符b,數棧pop出兩個數字,將兩個數字按照b操作符進行運算,將運算得到的結果入數棧,並將當前操作符a入符棧。

4.2.2 如果當前操作符a的優先順序大於符棧頂操作符的優先順序,直接將其入符棧。

5 重複3-4步驟,直到遍歷結束

6 此時,從符棧pop出乙個操作符,從數棧pop出兩個數字,並進行運算,將結果push進數棧

7 重複6步驟,直到符棧為空為止。此時數棧應該有乙個數字,即為最終結果。

package stack;

public class calculator else else

}

}else else }}

//判斷是否遍歷結束

index++;

if(index >= expression.length())

} //開始計算

while(true)

num1 = numsstack.pop();

num2 = numsstack.pop();

oper = opersstack.pop();

res = opersstack.calculator(num1, num2, oper);

numsstack.push(res);

// system.out.println("num1:"+num1);

// system.out.println("num2:"+num2);

// system.out.println("oper:"+oper);

// system.out.println("res:"+res);

} res = numsstack.pop();

system.out.printf("運算結果:%s = %d\n",expression,res); }}

class arraystack2

//判滿

public boolean isfull()

//判空

public boolean isempty()

//進棧

public void push(int item)

stack[++top] = item; }

//得到操作符的優先順序

public int privority( int oper) else if(oper == '*' || oper == '/') else

} //判斷是否是操作符

public boolean isoper(int oper)

//得到棧頂的元素

public int getpeek()

//運算

public int calculator(int num1,int num2,int oper)

return res; }

//出棧

public int pop()

int value = stack[top--];

return value; }

//遍歷棧(從棧頂到棧底順序遍歷)

public void list()

for(int i=top; i>=0; i--) }

}

棧的應用 計算器 加,減,乘,除,括號

最初接觸此類的題目,是只涉及到的加減乘除四則運算,沒有符號的操作,因為在一次筆試中遇到了有括號的情況,抱著遇到問題一定要去解決的態度,筆試結束後嘗試將這道題目進行還原。這裡的思想主要是用到了棧,分為兩個棧,乙個棧存放數字,另外乙個棧存放運算子和括號 include include using nam...

演算法筆記7 棧的應用 簡單計算器

思路 1.先將中綴表示式轉成字尾表示式,2.計算字尾表示式 include include include include include include using namespace std struct node string str stacks 在change 存放操作符,在cal 中存放...

加減乘除 計算器

二 程式效果說明 程式的很多bug已解決,但還是有一些bug沒有發現,或沒有解決 已發現的bug 1 如果計算過程出現科學計數法 乙個特別小的數除以乙個特別大的數時 就會使程式出錯,進入無限迴圈 2 如果不指定計算資料小數點後的有效位數,程式也會進入死迴圈 下圖是程式計算結果與python計算結果的...