利用棧計算一串字符串的原理
package primDataStructure;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Stack;
/*
* 由於這裏變量是int,其實並不能進行除運算,因此可以自行改成double.
* */
public class stackToCacu {
Map<Character,Integer> map=new HashMap<Character,Integer>();
int result;
Stack<Integer> nStack;
Stack<Character>cStack;
//初始化map中各個運算符的優先級
public stackToCacu() {
map.put('x',2);
map.put('/', 2);
map.put('+', 1);
map.put('-', 1);
result=0;
nStack=new Stack<Integer>();
cStack=new Stack<Character>();
}
//計算字符串並返回值
public int cacu(String s) {
char number;
char operator;
char unknown='p';
//遍歷字符串,取出每個字符
for(int i=0;i<s.length();i++) {
unknown=s.charAt(i);
//若是數字類型的字符則直接入數字棧
if(unknown>='0'&&unknown<='9') {
number=unknown;
int value=number-'0';
nStack.push(value);
//continue;
}
//若是運算符則進行以下操作
else {
operator=unknown;
//若運算符棧爲空則直接入棧
if(cStack.isEmpty()) {
cStack.push(operator);
}
/*若運算符棧非空,則比較兩者的優先級,若棧內的運算符優先級高則pop出來,
* 並從數字棧pop出兩個進行運算,將優先級低的入棧
* */
else {
if(map.get(operator)<=map.get(cStack.peek())) {
result=0;
int n1,n2;
char p1=cStack.pop();
n1=nStack.pop();
n2=nStack.pop();
switch(p1){
case 'x':result+=n2*n1;break;
case '/':result+=n2/n1;break;
case '+':result+=n2+n1;break;
case '-':result+=n2-n1;break;
default:break;
}
nStack.push(result);
cStack.push(operator);
}
else {
//cStack.push(item)
int n1,n2;
char p1=cStack.pop();
n1=nStack.pop();
n2=nStack.pop();
switch(p1){
case 'x':result+=n2*n1;break;
case '/':result+=n2/n1;break;
case '+':result+=n2+n1;break;
case '-':result+=n2-n1;break;
default:break;
}
nStack.push(result);
}
}
}
}
/*
* 在字符串遍歷結束後有可能存在數字棧和運算符棧非空,且肯定有且只有一對,直接取出運算即可。
* */
if(!cStack.isEmpty()) {
result=0;
int n1,n2;
char p1=cStack.pop();
n1=nStack.pop();
n2=nStack.pop();
switch(p1){
case 'x':result+=n2*n1;break;
case '/':result+=n2/n1;break;
case '+':result+=n2+n1;break;
case '-':result+=n2-n1;break;
default:break;
}
nStack.push(result);
}
return nStack.pop();
}
public static void main(String args[]) {
String cacus=null;
Scanner scan=new Scanner(System.in);
cacus=scan.nextLine();
stackToCacu cacu=new stackToCacu();
int result=cacu.cacu(cacus);
System.out.println("結果爲"+result);
}
}