(4 2)棧實現計算器

2022-10-08 21:57:28 字數 2565 閱讀 7799

1. 通過乙個 index 值(索引),來遍歷我們的表示式

2. 如果我們發現是乙個數字, 就直接入數棧

3. 如果發現掃瞄到是乙個符號, 就分如下情況

3.1 如果發現當前的符號棧為 空,就直接入棧

3.2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者等於棧中的操作符,

就需要從數棧中pop出兩個數,在從符號棧中pop出乙個符號,進行運算,將得到結果,入數棧,

然後將當前的操作符入符號棧, 如果當前的操作符的優先順序大於棧中的操作符, 就直接入符號棧.

4. 當表示式掃瞄完畢,就順序的從 數棧和符號棧中pop出相應的數和符號,並執行.

5. 最後在數棧只有乙個數字,就是表示式的結果

package

com.atguigu.stack;

public

class

calculator

else

}else

} else

else}}

//讓index + 1, 並判斷是否掃瞄到expression最後.

index++;

if (index >=expression.length())

}//當表示式掃瞄完畢,就順序的從 數棧和符號棧中pop出相應的數和符號,並執行.

while(true

) num1 =numstack.pop();

num2 =numstack.pop();

oper =operstack.pop();

res =numstack.cal(num1, num2, oper);

numstack.push(res);

//入棧

}

//將數棧的最後數,pop出,就是結果

int res2 =numstack.pop();

system.out.printf("表示式 %s = %d", expression, res2);

}}//

先建立乙個棧,直接使用前面建立好

//定義乙個 arraystack2 表示棧, 需要擴充套件功能

class

arraystack2

//增加乙個方法,可以返回當前棧頂的值, 但是不是真正的pop

public

intpeek()

//棧滿

public

boolean

isfull()

//棧空

public

boolean

isempty()

//入棧-push

public

void push(int

value)

top++;

stack[top] =value;

}//出棧-pop, 將棧頂的資料返回

public

intpop()

int value =stack[top];

top--;

return

value;

}//顯示棧的情況[遍歷棧], 遍歷時,需要從棧頂開始顯示資料

public

void

list()

//需要從棧頂開始顯示資料

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

}//返回運算子的優先順序,優先順序是程式設計師來確定, 優先順序使用數字表示

//數字越大,則優先順序就越高.

public

int priority(int

oper)

else

if (oper == '+' || oper == '-')

else

}//判斷是不是乙個運算子

public

boolean isoper(char

val)

//計算方法

public

int cal(int num1, int num2, int

oper)

return

res;

}}

class

solution };

public

intcalculate(string s)

else

if (c == ')') else}}

else

else

//有乙個新操作要入棧時,先把棧內可以算的都算了

//只有滿足「棧內運算子」比「當前運算子」優先順序高/同等,才進行運算

while (!ops.isempty() && ops.peeklast() != '(')

else

}ops.addlast(c);}}

}//將剩餘的計算完

while (!ops.isempty()) calc(nums, ops);

return

nums.peeklast();

}void calc(dequenums, dequeops)

boolean isnumber(char

c) }

棧實現計算器

在表示式中的轉換規則 運算元 進棧 操作符 1 進棧 空棧 優先順序高 棧頂是 同時表示式不是 2 出棧並計算 表示式符號的優先順序不高於棧頂符號 表示式為 同時棧頂不為 表示式 0 同時棧不為空 3 出棧但不計算 表示式為 同時棧頂為 標頭檔案 標頭檔案 ifndef stack h define...

用棧實現計算器

我們平時用swith語句寫的計算器,只能處理簡單的兩個運算元和乙個運算子,這樣其實和日常應用方面差的有點遠,所以我們今天學習了一種用棧來實現一條複雜表示式的計算。這個需要用到棧的相關知識,除此之外我們還需要學會如何把中綴轉換成字尾表示式,比如 3 4 5 2 3這樣乙個表示式,從左至右遇到運算元壓入...

棧實現簡易計算器

計算數學表示式的值。輸入數學表示式,輸出表示式的計算結果。數學表示式由單個數字和運算子 構成,例如 2 3 4 5 6 4。include include include include using namespace std double result int tag template class...