JAVA數據結構學習2.1利用棧實現簡單的運算符計算

利用棧計算一串字符串的原理

在這裏插入圖片描述

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);
	}
}


發佈了18 篇原創文章 · 獲贊 1 · 訪問量 561
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章