JAVAは4つの操作を実現します
4つの操作の最初に、概念
* 5 1 +(2-3 / 4)のような、加算、減算、乗算、除算四則演算の四則演算を指します。私たちはすぐに答えを得ることができますが、それをプログラミングすることによって、その動作を達成するためにどのように?
ポーランド人の名前ルカ西Weiqiの論理学者も呼ばれ、逆ポーランド記法と呼ばれる式を表現する方法、発明後置式を。通常、我々は、四則演算をしている参照式を中置オペレータは真ん中の数字に常にあるので、。まず、一般的なコンピュータ持って中置表現に変換後置式し、その後操作を。次のように変換プロセスは次のとおりです。
-
まず、スタック構造を初期化し、スタックが、私はシンボリックスタックを呼んでいます。
-
そして、右の中置式、数字、式に接尾語を左からトラバース;彼らは括弧を放置すれば、それがスタックにプッシュされ、あなたはポップ操作を行って、右括弧が発生した場合、スタックを回しますすべての優先順位(左括弧がスタック全体ではなかった)、それは加算、減算の場合は、最近、左括弧の前にポップアップ表示するために、スタック要素がこれまでに左括弧なるまで表現に追加サフィックスなしブラケットを左に、接尾辞に追加要素以上オペレータの先頭要素に等しいが、オペレータスタック(スタックは確かに右ブラケット、最も低い優先順位を有する左ブラケット、加算および減算、乗算および除算最高続いていません)。
-
後中置式、空のスタック内横断、そして今度は後置式に追加要素をポップアップ表示されます。
このように、後置記法に変換するコンピュータの中置式を置きます。次のように計算値はその後、postfixの表現を開始しました:
-
また、スタック構造を初期化するか、直接スタックだけ使用。
-
トラバース後置式、スタック上の数字、二つの要素オペレータにスタック出口から出会いオペレータ終了する権利、出口はオペレータに放置した後、再進入動作の結果後置式はトラバース完了するまで積み重ねます。
-
完全なトラバース後置式は、スタックの一つの要素にバインドされた後、それは我々が望む結果です。
上記の例の例として、我々1+(2-3 / 4)* 5、プロセスである:「1」の後置表現に、「+」記号スタックに、「(」スタックにシンボル、「2」の放電後置表現、「 - 」スタックに記号括弧が残っているため、それは、+の前に排出されていない3「」「/」のシンボルは、スタックに、後置表現に設定されている「4」サフィックスに表現、そして私たちが遭遇する「)」、スタックに署名する必要があるので「(」後置記法にターンポップ後の要素、すなわちポップアップ「/」、「 - 」、後置式にして、 " *「スタックへのシンボル、」5「後置記法には、ここで私たちは文字の配列全体が終了した後、後置式に参加するために、ポップな要素のスタックに署名トラバース持って、私たちは、型の接尾辞の表現を取得します式:1 2 3 4 / --5 * +
第二に、実装コード
//四则运算
public class FourFundamentalRules {
private static Stack<Character> stack = new Stack<>();//后缀表达式
private static Stack<Character> stack_1 = new Stack<>();//符号栈
private static Stack<Character> stack_2 = new Stack<>();//临时栈
public static void main(String[] args) {
String str = "1+(2-3/4)*5";
try {
Double b = calculate(str);
System.out.println("运算结果为:"+b);
}catch (Exception e){
System.out.println("error");
}
}
//运算
private static Double calculate(String str) throws Exception{
char[] arr = str.toCharArray();
//转化为后缀表达式
for(int i=0;i<arr.length;i++){
if(Character.isDigit(arr[i])){//判断是否为数字
stack.push(arr[i]);
}else if(arr[i] == '*'||arr[i] == '/'){
while(!stack_1.empty()){
char ch = stack_1.pop();
if(ch == '('){
stack_1.push(ch);
break;
}else if(ch == '*' || ch == '/'){
stack.push(ch);
}else{
stack_2.push(ch);
}
}
while(!stack_2.empty()){
stack_1.push(stack_2.pop());
}
stack_1.push(arr[i]);
} else if(arr[i] == '+'|| arr[i] == '-'){
while(!stack_1.empty()){
char ch = stack_1.pop();
if(ch == '('){
stack_1.push(ch);
break;
}else if(ch == '*' || ch == '/'||ch == '+'|| ch == '-'){
stack.push(ch);
}else{
stack_2.push(ch);
}
}while(!stack_2.empty()){
stack_1.push(stack_2.pop());
}
stack_1.push(arr[i]);
}else if(arr[i] == '('){
stack_1.push(arr[i]);
}else if(arr[i] == ')'){
char ch = stack_1.peek();
while(ch != '('){
ch = stack_1.pop();
stack.push(ch);
}
stack.pop();
}else{
throw new Exception();
}
}
while(!stack_1.empty()){
stack.push(stack_1.pop());
}
//进行运算
while(!stack.empty()){
stack_2.push(stack.pop());
}
Stack<Double> s = new Stack<>();//用于最后计算的栈
while(!stack_2.empty()){
char ch = stack_2.pop();
if(ch == '*' || ch == '/'||ch == '+'|| ch == '-'){
double sum = 0;
double num1= s.pop();
double num2= s.pop();
switch (ch){
case '*':sum = num2*num1;break;
case '/':sum = num2/num1;break;
case '+':sum = num2+num1;break;
case '-':sum = num2-num1;break;
}
s.push(sum);
}else if (Character.isDigit(ch)){
s.push((double)Character.getNumericValue(ch));
}else{
throw new Exception();
}
}
return s.pop();
}
}
第三に、少しの知識の概要
文字の配列への1列
String str = "1+(2-3/4)*5";
char[] arr = str.toCharArray();
2.チャーはデジタルか否かを判断します
Character.isDigit(ch)
3.文字変換のint型のタイプ:
int型への<1> CHAR
関数を使用
Character.getNumericValue(ch);
若しくは
char ch = '1';
int n =(char)(ch-'0');
<2> int型charに変換
int n = 1;
char ch = (char)(n + '0');
範囲は、二重のint型回転とても強い選択コードよりも広くなっているので
この記事では、ブログjia_costaテキスト参照の最初の部分について説明し
ます。https://blog.csdn.net/jia_costa/article/details/79042679リンク