若要計算機具有處理標準表示式的能力,最重要的有兩步:
1、將中綴表示式轉化為字尾表示式
2、將字尾表示式進行運算得出結果
中綴表示式:標準四則運算表示式,即「8+(3-2*4)*10+2/2」
字尾表示式:所有的符號都是要在運算數字的後面出現。例:
將「8+(3-2*4)*10+2/2」轉為字尾表示式為:「8 3 2 4 * - 10 * + 2 2 / +」
中綴表示式轉字尾的規則:
1、從左至右遍歷中綴表示式,遇到數字就輸出,即成為字尾表示式的一部分;
2、如果是左括號,就壓入棧,如果是右括號,則棧中元素依次出棧,直到棧中左括號出棧。
3、如果是+、-運算子,若棧不為空,棧中元素依次出棧, 直到棧為空或遇到左括號,而後再將運算子壓入棧,
4、如果是*、/運算子,若棧不為空,且棧頂元素為*或/,則棧頂元素依次出棧,而後運算子入棧。
**如下:
public string infixtosuffix(string infixexpression)
stack.push(c);
} else if (c == '*' || c == '/')
stack.push(c);
} else if (c == ')')
stack.pop();
} else if (c == '(') else if (c != ' ')
}while (!stack.isempty())
return suffixexpression;
}
字尾表示式運算規則:
從左至右遍歷表示式的每個數字和符號,遇到數字就進棧,遇到的是符號,將處於棧頂的兩個數字出棧,進行運算,運算結果進棧,一直到最終獲得結果。
// 字尾表示式計算
public void expressioncalculation(string suffixexpression) else
}system.out.println(numstack.peek());
}private double calculation(double num1, double num2, string operator)
return result;
}
四則運算表示式完整**:
private double calculation(double num1, double num2, string operator)
return result;
}public double evaluateexpression(string expression)
else if (token.charat(0) == '+' || token.charat(0) == '-')
operatorstack.push(token.charat(0));
} else if (token.charat(0) == '*' || token.charat(0) == '/')
operatorstack.push(token.charat(0));
} else if (token.trim().charat(0) == '(') else if (token.trim().charat(0) == ')')
operatorstack.pop();
} else
}while(!operatorstack.isempty())
return operandstack.peek();
}
四則運算表示式求值(棧的應用)
1.前 中 字尾表示式的轉換 首先需要明白三者之間的轉換 自然表示式轉換為前 中 字尾表示式,其實是很簡單的。首先將自然表示式按照優先順序順序,構造出與表示式相對應的二叉樹,然後對二叉樹進行前 中 字尾遍歷,即得到前 中 字尾表示式。舉例說明將自然表示式轉換成二叉樹 a b c d 根據表示式的優先...
棧的應用 四則運算表示式求值
1 字尾表示法定義 所有的符號都是在要運算數字的後面出現。如 9 3 1 3 10 2的字尾表示法應該是9 3 1 3 10 2 2 字尾表示式計算結果 規則 從左到右遍歷表示式的每個數字和符號,遇到數字就進棧,遇到是符號,就將處於棧頂的兩個數字出棧,進行運算,運算結果進棧,一直到最終獲得結果。以9...
棧的應用 四則運算表示式求值
棧是計算機中非常基礎而又極其重要的一種資料結構,許多演算法的實現都離不開棧,它的特點是 先進後出 也可以說 後進先出 打乙個形象的比方 棧好比乙個彈夾,最先放入的子彈只能最後打出 而最後放入的子彈則最先打出。我們生活中接觸的表示式大部分都是中綴表示式,形如a b,這種表示式的特點是將運算子放在了運算...