基本思路:為了完成算術表示式的計算,用到了兩個棧,乙個用於存放運算元,另乙個用於存放操作符。
假設:程式中定義了兩個棧:operandstack(用來存放運算元)、operatorstack(用於存放操作符)。
在處理運算元和操作符之前,首先將它們壓入棧中。當要處理乙個操作符時,從operatorstack中將它彈出,然後將它應用在來自operandstack的前兩個運算元上,得到的結果再壓入operandstack中。
實現的詳細步驟:
掃瞄階段:程式從左到右掃瞄表示式,提取運算元、運算子和括號。
如果提取的字元是乙個運算元,將它壓入operandstack中。
如果提取的字元是乙個+或-的運算子,因為+、-運算子在算術表示式中的優先順序是最低的,所以此時在將+或者-運算子插入棧中之前,可以處理operatorstack棧頂的所有運算子,最後將提取出來的運算子壓入operatorstack中。
如果提取的字元是乙個*或/的運算子,則處理operatorstack棧頂的所有*和/的運算子,最後將新提取出來的運算子壓入operatorstack中。
如果提取出來的運算子是乙個"(",則將它壓入operatorstack中。
如果提取出來的運算子是乙個")",則重複處理operatorstack棧頂的運算子,直到看到棧頂的運算子為")"。
清除棧階段:重複處理來自operatorstack棧頂的運算子,直到operatorstack為空為止。
**實現:
public static int evaluateexpression(string expression)else if(chararr[i].trim().equals("+") || chararr[i].trim().equals("-"))
operatorstack.push(chararr[i].charat(0));//將操作符壓入操作符棧中
}else if(chararr[i].trim().equals("*") || chararr[i].trim().equals("/"))
operatorstack.push(chararr[i].charat(0));
}else if(chararr[i].trim().equals("("))else if(chararr[i].trim().equals(")"))
operatorstack.pop();//將進行過計算的左括號彈出
}else
}//對棧中資料進行計算,知道棧為空為止
while(!operatorstack.isempty())
//此時運算元棧中的棧頂元素也就是計算結果
return operandstack.pop();
}/**
* 對操作符棧頂的乙個操作符進行計算
* @param operandstack
* @param operatorstack
*/public static void processoneoperator(stack operandstack,stack operatorstack)else if(op == '-')else if(op == '*')else if(op == '/')
} 4.測試**:
public static void main(string args)
使用棧完成算術表示式的計算
需要兩個棧來分別儲存我們的操作符和數字 通過乙個 index 值 索引 來遍歷我們的表示式 如果我們發現是乙個數字,就直接入數棧 如果發現掃瞄到是乙個符號,就分如下情況 3.1 如果發現當前的符號棧為 空,就直接入棧 3.2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者等於棧中...
使用棧完成表示式的計算
使用棧完成表示式的計算思路 1 通過乙個index值,來遍歷我們的表示式 2 如果我們發現是乙個數字,就直接入數棧 3 如果掃瞄到的是乙個符號,就分如下情況 3.1 如果發現當前的符號棧為空,就直接入棧 3.2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者 等於棧中的操作符,就...
使用棧來計算算術表示式
之所以寫這個,是因為最近在學習c 的過程中,c primer 第五版 9.6的習題跟這個有關,在網上看看些人的思路,也就做出來了,正好寫到部落格裡面。原題如下 使用 stack 處理括號化的表示式。當你看到乙個左括號,將其記錄下來。當你在乙個左括號之後看到乙個右括號,從 stack 中 pop 物件...