用java寫的計算器的程序,主要是通過控制臺輸入,主要方法是使用scanner類來接收用戶從鍵盤輸入的一個算式,通過分解算式,存入兩個字符串,判斷中間的的符號,進行相應計算,如下代碼:
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名注冊、雅安服務器托管、營銷軟件、網站建設、桑日網站維護、網站推廣。
System.out.println("-----------------------------------");
System.out.println("請輸入一個算術表達式,如:45*23");
Scanner?in?=?new?Scanner(System.in);//接收用戶從鍵盤輸入的字符
String?str?=?in.nextLine();
StringBuffer?buffer?=?new?StringBuffer();//保存左側的數(shù)字
StringBuffer?buffer1?=?new?StringBuffer();//保存右側的數(shù)字
char?t?=?'?';//保存運算符
for?(int?i?=?0;?i??str.length();?i++)?{
if?(str.charAt(i)?==?'+'?||?str.charAt(i)?==?'-'
||?str.charAt(i)?==?'*'?||?str.charAt(i)?==?'/')?{
t?=?str.charAt(i);//識別是什么運算符
for?(int?j?=?i?+?1;?j??str.length();?j++)?{
buffer1.append(str.charAt(j));
}
break;
}?else?{
buffer.append(str.charAt(i));
}
}
String?c?=?buffer.toString();
String?d?=?buffer1.toString();
double?a?=?Double.parseDouble(c);
double?b?=?Double.parseDouble(d);
double?sum?=?0;
if?(t?==?'+')?{
sum?=?a?+?b;
}
if?(t?==?'-')?{
sum?=?a?-?b;
}
if?(t?==?'*')?{
sum?=?a?*?b;
}
if?(t?==?'/')?{
sum?=?a?/?b;
}
System.out.println("程序運算...");
System.out.println(c+t+d+"="+sum);
System.out.print("-----------------------------------");
運行結果如下:
代碼網上很多,只說說算法吧
12+8/4-5+(3-4)
把這樣的表達式拆成:(操作數(shù))(操作符) 、
12+
8/
4-
5+(
3-
4)
(術語叫做逆波蘭式)
默認的計算順序是從左往右,記為left。另設從右往左,記為right
設計Element類,具有 操作數(shù) operant, 操作符operator, 操作順序 order三個屬性
用兩個先進后出的棧結構StackElement a,b;
一開始所有的Element都在a中,逐個彈出計算合并值,
當遇到乘、除、括號時計算順序改變成right,把當前結果放到b中暫存。
直到再次遇到加、減、)右括號時,意味計算順序復位成left,先把b中的暫存結果全部合并后,再繼續(xù)算a中的剩余數(shù)據(jù)
最后合并成一個結果值。
表達式求值 逆波蘭表達式算法 如下:
import java.util.ArrayList;
import java.util.List;
public class MyStack {
private ListString l;
private int size;
public String top;
public MyStack() {
l = new ArrayListString();
size = 0;
top = null;
}
public int size() {
return size;
}
public void push(String s) {
l.add(s);
top = s;
size++;
}
public String pop() {
String s = l.get(size - 1);
l.remove(size - 1);
size--;
top = size == 0 ? null : l.get(size - 1);
return s;
}
}
import java.util.ArrayList;
import java.util.List;
public class Nbl {
private static MyStack ms1 = new MyStack();//生成逆波蘭表達式的棧
private static MyStack ms2 = new MyStack();//運算棧
/**
* 將字符串轉換為中序表達式
*/
public static ListString zb(String s) {
ListString ls = new ArrayListString();//存儲中序表達式
int i = 0;
String str;
char c;
do {
if ((c = s.charAt(i)) 48 || (c = s.charAt(i)) 57) {
ls.add("" + c);
i++;
} else {
str = "";
while (i s.length() (c = s.charAt(i)) = 48
(c = s.charAt(i)) = 57) {
str += c;
i++;
}
ls.add(str);
}
} while (i s.length());
return ls;
}
/**
* 將中序表達式轉換為逆波蘭表達式
*/
public static ListString parse(ListString ls) {
ListString lss = new ArrayListString();
for (String ss : ls) {
if (ss.matches("\d+")) {
lss.add(ss);
} else if (ss.equals("(")) {
ms1.push(ss);
} else if (ss.equals(")")) {
while (!ms1.top.equals("(")) {
lss.add(ms1.pop());
}
ms1.pop();
} else {
while (ms1.size() != 0 getValue(ms1.top) = getValue(ss)) {
lss.add(ms1.pop());
}
ms1.push(ss);
}
}
while (ms1.size() != 0) {
lss.add(ms1.pop());
}
return lss;
}
/**
* 對逆波蘭表達式進行求值
*/
public static int jisuan(ListString ls) {
for (String s : ls) {
if (s.matches("\d+")) {
ms2.push(s);
} else {
int b = Integer.parseInt(ms2.pop());
int a = Integer.parseInt(ms2.pop());
if (s.equals("+")) {
a = a + b;
} else if (s.equals("-")) {
a = a - b;
} else if (s.equals("*")) {
a = a * b;
} else if (s.equals("\")) {
a = a / b;
}
ms2.push("" + a);
}
}
return Integer.parseInt(ms2.pop());
}
/**
* 獲取運算符優(yōu)先級
* +,-為1 *,/為2 ()為0
*/
public static int getValue(String s) {
if (s.equals("+")) {
return 1;
} else if (s.equals("-")) {
return 1;
} else if (s.equals("*")) {
return 2;
} else if (s.equals("\")) {
return 2;
}
return 0;
}
public static void main(String[] args) {
System.out.println(jisuan(parse(zb("0-8+((1+2)*4)-3+(2*7-2+2)"))));
}
}
while(Character.isDigit(chars[i])||chars[i]=='.') {
s.append(chars[i]);
}
這一段是死循環(huán)。。stack一直追加參數(shù),所以溢出了
import java.util.Stack;
/**
* @author wengsh
* @date 2010-6-3 用 輸入 (6+5)*(5+5) 測試一下
*/
public class MyDemo {
public static void main(String[] a) {
StackCharacter stack = new StackCharacter();
StringBuffer sb = new StringBuffer();
if (a.length 1) {
System.out.println("參數(shù)長度不夠");
} else {
String s = a[0].trim();
char[] c = s.toCharArray();
try {
for (int i = 0; i c.length; i++) {
int priority = getPriority(c[i]);
if (priority == -1) { // 如果是數(shù)字
sb.append(c[i]); // 輸出數(shù)字或都字母
} else {
if (stack.isEmpty()) {// 當棧為空時
stack.push(c[i]); // 把字符壓入棧
} else {// 當棧為不空時
if (priority == -2) { // 如果是 ')'
while (!stack.isEmpty()
getPriority(stack.peek()) != 8) {
sb.append(stack.pop());// 把'('之上的字符彈出棧并輸出
}
stack.pop(); // 棧彈出'('
} else {
// 當要壓入棧的字符的優(yōu)先級小于 等于棧頂字符的優(yōu)先級且棧頂字符不為'('時
while (!stack.isEmpty()
priority = getPriority(stack.peek())
getPriority(stack.peek()) != 8) {
sb.append(stack.pop()); // 彈出棧頂字符并輸出
}
stack.push(c[i]);// 將此時的字符壓入棧頂
}
}
}
}
// 讀到輸入末尾
while (!stack.isEmpty()) {
sb.append(stack.pop()); // 彈出棧中所有元素并輸出
}
System.out.println(sb); // 結果 65+55+*
System.out.println(calstack(sb.toString()));//結果 110.0
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 獲得字符串優(yōu)先級如果字符不在給定的范圍內,則拋出異常,數(shù)字和字母的優(yōu)先級最低
*
* @param c
* @return
* @throws Exception
*/
public static int getPriority(char c) throws Exception {
int priority = -1;
if (Character.isDigit(c)) {
priority = -1;
} else if (Character.isLetter(c)) {
priority = 0;
} else {
if (c == '(') {
priority = 8;
} else if (c == '*' || c == '/') {
priority = 5;
} else if (c == '+' || c == '-') {
priority = 4;
} else if (c == ')') {
priority = -2;
} else {
throw new Exception("無法解析的前序表達式: " + c);
}
}
return priority;
}
/**
* 計算棧結果
* 6+5*8
* @param s
* @return
*/
public static float calstack(String s) {
StackFloat stack = new StackFloat();
char[] c = s.toCharArray();
try {
for (int i = 0; i c.length; i++) {
int priority = getPriority(c[i]);
if (priority == -1) {
stack.push(new Float(Character.digit(c[i], 10)));
} else {
stack.push(cal(stack.pop(), stack.pop(), c[i]));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return stack.pop();
}
/**
* a b 運算
* @param a
* @param b
* @param opertor
* @return
*/
public static float cal(float a, float b, char opertor) {
float r = 0;
switch (opertor) {
case '+':
r = a + b;
break;
case '-':
r = a - b;
break;
case '*':
r = a * b;
break;
case '/':
r = a / b;
break;
}
return r;
}
}
下面的代碼是用來計算表達式的,看看是不是你要的
public class OPNode {
char op;// 運算符號
int level;// 優(yōu)先級
//設置優(yōu)先級
public OPNode(String op) {
this.op = op.charAt(0);
if (op.equals("+") || op.equals("-")) {
this.level = 1;
} else if (op.equals("*") || op.equals("/")) {
this.level = 2;
} else if (op.equals("(")) {
this.level = -3;
} else {
this.level = -1;
}
}
}
//主類
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class OPText {
public static void main(String[] args) {
String expression = "2+2+(8-2)/3";// 要計算的表達式
List list = new LinkedList();
//正則式
Pattern entryOfExpression = Pattern
.compile("[0-9]+(\\.[0-9]+)?|\\(|\\)|\\+|-|\\*|/");
Deque stack = new LinkedList();//棧
Matcher m = entryOfExpression.matcher(expression);
while (m.find()) {
//提取語素
String nodeString = expression.substring(m.start(), m.end());
if (nodeString.matches("[0-9].*")) {
list.add(Double.valueOf(nodeString));//如果是數(shù)字直接送入列表
} else {
OPNode opn = new OPNode(nodeString);//如果是運算符
int peekLevel = (stack.peek() == null) ? 0 : ((OPNode) stack
.peek()).level;
if (opn.level =peekLevel) {
stack.push(opn);//新的運算符比舊的優(yōu)先級別高則入棧
} else {
if (opn.level == -1) {
OPNode temp = (OPNode) stack.pop();
while (temp.level != -3) {//如果為"("則一直出棧一直到")"
list.add(temp);
System.out.println(nodeString);
temp = (OPNode) stack.pop();
}
} else if (opn.level == -3) {
stack.push(opn);
} else {//如果新運算符比棧頂運算符底則一直出棧
OPNode temp = (OPNode) stack.pop();
while (temp.level opn.level) {
list.add(temp);
if (stack.isEmpty()) {
break;
}
temp = (OPNode) stack.pop();
}
stack.push(opn);
}
}
}
}
OPNode temp = null;
while (!stack.isEmpty()) {
temp = (OPNode) stack.pop();
list.add(temp);
}//后續(xù)表達式計算
stack.clear();
for (Object o : list) {
if (o instanceof Double) {
stack.push(o);//為數(shù)字入棧
} else {
double op2 = ((Double) stack.pop()).doubleValue();
double op1 = ((Double) stack.pop()).doubleValue();
switch (((OPNode) o).op) {
case '+':
stack.push(op1 + op2);
break;
case '-':
stack.push(op1 - op2);
break;
case '*':
stack.push(op1 * op2);
break;
case '/':
stack.push(op1 / op2);
break;
}
}
}
System.out.println("結果為:" + stack.pop());
}
}
呃,太晚了,沒心思去改了
明天再說
分享題目:逆波蘭java代碼 逆波蘭式代碼
轉載來源:http://vcdvsql.cn/article16/hehhgg.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站策劃、定制開發(fā)、ChatGPT、電子商務、云服務器、App設計
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)