最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java中綴表達(dá)式的實(shí)現(xiàn)

 更新時(shí)間:2022年07月12日 15:29:41   作者:鈔票  
中綴表達(dá)式是一個(gè)通用的算術(shù)或邏輯公式表示方法。,中綴表達(dá)式不容易被計(jì)算機(jī)解析,但仍被許多程序語言使用,因?yàn)樗先藗兊钠毡橛梅?。本文介紹了實(shí)現(xiàn)中綴表達(dá)式的方法,需要的可以參考一下

1.概念

什么是中綴表達(dá)式,什么是后綴表達(dá)式?

從小學(xué)開始學(xué)習(xí)的四則運(yùn)算,例如:3+(5*(2+3)+7) 類似這種表達(dá)式就是中綴表達(dá)式。中綴表達(dá)式人腦很容易理解,各個(gè)算符的優(yōu)先級,人腦也很容易判斷,先算括弧里的,再算*,再算+,-

但是這種表達(dá)式很不利于計(jì)算機(jī)計(jì)算,通過某種方式把前綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式方便計(jì)算機(jī)進(jìn)行計(jì)算,如3+(5*(2+3)+7)的后綴表達(dá)式就是3,5,2,3,+,*,7,+, +。這個(gè)表達(dá)式計(jì)算機(jī)很容易計(jì)算,為什么容易計(jì)算,通過算法流程2,就會(huì)一個(gè)深入的理解。

2.算法流程

如何把中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式?比如說3+(5*(2+3)+7)的轉(zhuǎn)成后綴表達(dá)式的流程如何?

操作符優(yōu)先級:

  • +,- 小于*,/
  • + 等于 -
  • * 等于 /

左括號和右括號作為特殊操作符特殊處理。(碰到’(’不用判斷優(yōu)先級直接入操作符棧,碰到’)’,也不用判斷優(yōu)先級,直接出操作符棧)

大致算法掌握以下幾個(gè)流程:

準(zhǔn)備兩個(gè)棧,一個(gè)是數(shù)字棧A,一個(gè)是操作符棧(+,-,*,/(,))B等

1.0 對于數(shù)字棧A,遇到數(shù)字直接入棧A。

2.0 對于操作符棧B,分幾種情況

2.1 碰到 ‘(‘操作符直接入棧

2.2 碰到 ‘)’操作符,不停的把操作符棧B出棧,直到遇到’)’。(把’(’到’)’之間的彈出的操作符依次入棧A)

2.3 碰到’+,-,* /’比較當(dāng)前元素(假設(shè)當(dāng)前元素current)和B棧棧頂?shù)牟僮鞣?假設(shè)棧頂元素是top)的優(yōu)先級.

2.3.1 如果top >= current, B棧出棧且循環(huán)比較,直到top < current退出循環(huán),且把 current入棧

2.3.2 如果top < current, 直接把current入B棧

3.0 掃描完整個(gè)字符串,如果B棧中還有操作符,依次出棧入A

按照上面算法演示3+(5*(2+3)+7)的流程:

1,碰到3,3入A棧 [3,]
2,碰到+,入B棧   [+,]
3,碰到(,入B棧   [+,(]
4,碰到5,入A棧   [3,5]
5,碰到*,*的優(yōu)先級大于 (,入B棧[ +,(,*]
6,碰到(,入B棧[ +,(,*,(]
7,碰到2,入A棧   [3,5,2]
8,碰到+,入B棧[ +,(,*,(,+]
9,碰到3,入A棧   [3,5,2,3]
10,碰到),彈出B棧,直接到 ‘(‘,把彈出的操作符入A棧。B:[ +,(,*] A:[3,5,2,3,+]
11,碰到+, +的優(yōu)先級小于B的棧頂元素 *,所以*從B出棧,入A,并把+入B。B:[ +,(,+] A:[3,5,2,3,+,*]
12,碰到7,入A棧   [3,5,2,3,+,*,7]
13,碰到),彈出B棧,直接到 ‘(‘,把彈出的操作符入A棧。B:[ +] A:[3,5,2,3,+,*,7,+]
14, 掃描完整個(gè)字符串,判斷B是否為空,不為空把B棧的元素彈出,入A。當(dāng)前不為空,所以最終A棧的元素為 A:[3,5,2,3,+,*,7,+, +]

所以最終A的后綴表達(dá)式是3,5,2,3,+,*,7,+, +

計(jì)算機(jī)拿到這個(gè)會(huì)怎么計(jì)算呢?流程如下:

  • 碰到數(shù)字直接入棧
  • 碰到操作符,直接彈出兩個(gè)棧頂元素,通過操作符計(jì)算,把結(jié)果壓入棧

通過步驟1,2循環(huán)計(jì)算,最終棧里只會(huì)有一個(gè)元素,這個(gè)就是表達(dá)式的結(jié)果。

我們來演練一下:

1,碰到數(shù)字3,5,2,3直接入棧A[3,5,2,3]
2,碰到+,彈出棧頂2,3,相加得5 入棧A[3,5,5]
3,碰到*,彈出棧頂5,5,相乘得25 入棧A[3,25]
4,碰到7,直接入棧A[3,25,7]
5,碰到+,彈出棧頂25,7,相加得32 入棧A[3,32]
6,碰到+,彈出棧頂3,32,相加得35 入棧A[35]

通過上面可以得知,計(jì)算機(jī)很容易計(jì)算,從左掃描到右就能把結(jié)果得出。

3 代碼實(shí)現(xiàn)

mid2post 求后綴表達(dá)式

calcPostExp 拿到后綴表達(dá)式求值

cmpPriority 優(yōu)先級比較

//優(yōu)先級
bool cmpPriority(char top, char cur)//比較當(dāng)前字符與棧頂字符的優(yōu)先級,若棧頂高,返回true
{
	if ((top == '+' || top == '-') && (cur == '+' || cur == '-'))
		return true;
	if ((top == '*' || top == '/') && (cur == '+' || cur == '-' || top == '*' || top == '/'))
		return true;
	if (cur == ')')
		return true;
	return false;
}

求后綴表達(dá)式求值

vector<string> mid2post(string &str)
{

	vector<string>vstr;
	stack<char>cstack;
	for (int i = 0;i<str.size();++i)//掃描字符串
	{
		string temp = "";
		if (str[i] >= '0' && str[i] <= '9')//若是數(shù)字
		{
			temp += str[i];
			while (i + 1<str.size() && str[i + 1] >= '0' && str[i + 1] <= '9')
			{
				temp += str[i + 1];//若是連續(xù)數(shù)字
				++i;
			}
			vstr.push_back(temp);
		}
		else if (cstack.empty() || str[i] == '(')//若??栈蛘咦址麨?('
			cstack.push(str[i]);
		else if (cmpPriority(cstack.top(), str[i]))//若棧頂元素優(yōu)先級較高,棧頂元素出棧
		{
			if (str[i] == ')')//若當(dāng)前字符是右括號,棧中元素出棧,入字符串?dāng)?shù)組中,直到遇到'('
			{
				while (!cstack.empty() && cstack.top() != '(')
				{
					temp += cstack.top();
					cstack.pop();
					vstr.push_back(temp);
					temp = "";
				}
				cstack.pop();
			}
			else//棧中優(yōu)先級高的元素出棧,入字符串?dāng)?shù)組,直到優(yōu)先級低于當(dāng)前字符
			{
				while (!cstack.empty() && cmpPriority(cstack.top(), str[i]))
				{
					temp += cstack.top();
					cstack.pop();
					vstr.push_back(temp);
					temp = "";
				}
				cstack.push(str[i]);
			}
		}
		else//當(dāng)前字符優(yōu)先級高于棧頂元素,直接入棧
			cstack.push(str[i]);
	}
	while (!cstack.empty())//棧中還存在運(yùn)算符時(shí),出棧,存入字符串?dāng)?shù)組
	{
		string temp = "";
		temp += cstack.top();
		cstack.pop();
		vstr.push_back(temp);
	}
	return vstr;
}

對后綴表達(dá)式進(jìn)行求值,主要是根據(jù)運(yùn)算符取出兩

int calcPostExp(vector<string> & vstr)//對后綴表達(dá)式進(jìn)行求值,主要是根據(jù)運(yùn)算符取出兩個(gè)操作數(shù)進(jìn)行運(yùn)算
{
	int num, op1, op2;
	stack<int>opstack;
	for (int i = 0;i<vstr.size();++i)
	{
		string temp = vstr[i];
		if (temp[0] >= '0' && temp[0] <= '9')//如果當(dāng)前字符串是數(shù)字,利用字符串流轉(zhuǎn)化為int型
		{
			stringstream ss;
			ss << temp;
			ss >> num;
			opstack.push(num);
		}
		else if (vstr[i] == "+")//若是操作符,取出兩個(gè)操作數(shù),進(jìn)行運(yùn)算,并將結(jié)果存入
		{
			op2 = opstack.top();
			opstack.pop();
			op1 = opstack.top();
			opstack.pop();
			opstack.push(op1 + op2);
		}
		else if (vstr[i] == "-")
		{
			op2 = opstack.top();
			opstack.pop();
			op1 = opstack.top();
			opstack.pop();
			opstack.push(op1 - op2);
		}
		else if (vstr[i] == "*")
		{
			op2 = opstack.top();
			opstack.pop();
			op1 = opstack.top();
			opstack.pop();
			opstack.push(op1*op2);
		}
		else if (vstr[i] == "/")
		{
			op2 = opstack.top();
			opstack.pop();
			op1 = opstack.top();
			opstack.pop();
			opstack.push(op1 / op2);
		}
	}
	return opstack.top();//最終的棧頂元素就是求解的結(jié)果
}

到此這篇關(guān)于詳解Java中綴表達(dá)式的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java中綴表達(dá)式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中單雙斜杠的使用圖文詳解

    java中單雙斜杠的使用圖文詳解

    JAVA中的斜杠有正斜杠與反斜杠之分,正斜杠,一般就叫做斜杠,下面這篇文章主要給大家介紹了關(guān)于java中單雙斜杠使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Java中final,finally,finalize三個(gè)關(guān)鍵字的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中final,finally,finalize三個(gè)關(guān)鍵字的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章給大家收集整理了有關(guān)java中final,finally,finalize三個(gè)關(guān)鍵字的區(qū)別介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧
    2017-04-04
  • Java二分法查找_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java二分法查找_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java二分法查找的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java  Object類中的常用API介紹

    Java  Object類中的常用API介紹

    這篇文章主要介紹了Java  Object類中的常用API介紹,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • Java JDK8新增Optional工具類講解

    Java JDK8新增Optional工具類講解

    這篇文章主要介紹了Java JDK8新增Optional工具類講解,本文通過老版和jdk8對比對null的處理方式,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • ExpressionUtil工具類的應(yīng)用實(shí)例

    ExpressionUtil工具類的應(yīng)用實(shí)例

    這篇文章主要給大家介紹了關(guān)于ExpressionUtil工具類的應(yīng)用實(shí)例,常用的工具類有很多,這是其中一個(gè),了解基本的API可以幫助我們更好的開發(fā),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • 詳解springboot+atomikos+druid?數(shù)據(jù)庫連接失效分析

    詳解springboot+atomikos+druid?數(shù)據(jù)庫連接失效分析

    本文主要介紹了springboot+atomikos+druid?數(shù)據(jù)庫連接失效分析,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • JAVA中Context的詳細(xì)介紹和實(shí)例分析

    JAVA中Context的詳細(xì)介紹和實(shí)例分析

    這篇文章主要介紹了JAVA中Context的詳細(xì)介紹和實(shí)例分析,Context是維持android各組件能夠正常工作的一個(gè)核心功能類。如果感興趣來學(xué)習(xí)一下
    2020-07-07
  • SpringBoot自定義轉(zhuǎn)換器用法詳解

    SpringBoot自定義轉(zhuǎn)換器用法詳解

    在SpringBoot中,轉(zhuǎn)換器用于將一個(gè)類型的值轉(zhuǎn)換為另一個(gè)類型,這在處理HTTP請求參數(shù)、響應(yīng)結(jié)果、表單數(shù)據(jù)等方面非常有用,SpringBoot提供了多種方式來定義和使用轉(zhuǎn)換器,本文給大家介紹了
    如何使用SpringBoot自定義轉(zhuǎn)換器,需要的朋友可以參考下
    2023-08-08
  • springboot利用AOP完成日志統(tǒng)計(jì)的詳細(xì)步驟

    springboot利用AOP完成日志統(tǒng)計(jì)的詳細(xì)步驟

    項(xiàng)目用到了過濾器,可能有的人會(huì)不理解,之所以用過濾器是因?yàn)橄胍谌罩居涗沺ost請求的json數(shù)據(jù)。本文重點(diǎn)給大家介紹springboot利用AOP完成日志統(tǒng)計(jì)的詳細(xì)步驟,感興趣的朋友跟隨小編一起看看吧
    2021-12-12

最新評論

永修县| 麦盖提县| 涪陵区| 西城区| 尤溪县| 镇雄县| 和平区| 祁连县| 阜城县| 台前县| 武夷山市| 南丰县| 剑川县| 维西| 昌吉市| 三原县| 江安县| 蓝田县| 普安县| 辉县市| 东宁县| 石林| 卢氏县| 绍兴县| 高雄市| 寿光市| 余姚市| 德令哈市| 夏河县| 凯里市| 化隆| 丰城市| 江川县| 长白| 泗阳县| 二手房| 吉首市| 如皋市| 友谊县| 西乌珠穆沁旗| 留坝县|