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計算結果的...