国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

表達式求值問題-雙棧模板化實現(xiàn)

這篇具有很好參考價值的文章主要介紹了表達式求值問題-雙棧模板化實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

? ? ? ? 好久不見,真的很久都沒有更新博客了,最近很多事情,所以比較忙碌,沒有時間每天都學(xué)算法,但是我會擠時間盡量做到,每兩三天就更新博客,我會努力的,加油~

表達式求值問題-雙棧模板化實現(xiàn)

? ? 前言:計算器都見過吧,我們今天要講的就是類似于計算器計算數(shù)據(jù)的簡單實現(xiàn),我們需要注意一些問題,比如運算符優(yōu)先級,運算順序等等問題,話不多說,沖沖沖?。?!

目錄

1.問題引入

2.問題分析及解決方法

如何設(shè)計優(yōu)先級問題?

設(shè)計計算函數(shù)和啟動計算條件

完整代碼(可做為表達式計算模板使用)

3.金句頻道


1.問題引入

表達式求值問題-雙棧模板化實現(xiàn)

2.問題分析及解決方法

? ? ? ?首先,我們先來看一下整體思路:對于一個表達式,我們會讀入括號,運算符和數(shù)字三種字符,我們需要將這些字符區(qū)分開再進行計算,為了保證運算的正確性,由運算符帶來的優(yōu)先級問題是我們解決這個問題的關(guān)鍵,解決了運算符優(yōu)先級問題,我們就可以將運算符和數(shù)字分別存入一個棧中,用讀取到' ) '和讀取到優(yōu)先級比已經(jīng)保存在棧內(nèi)的運算符來作為啟動計算的條件(讀到右括號,我們就可以將整個括號內(nèi)部的部分算出來,再將算得結(jié)果壓入保存數(shù)字的棧中用于后續(xù)的計算,而對于讀取到優(yōu)先級低的運算符,因為我們以棧存儲數(shù)據(jù),導(dǎo)致我們在計算的時候就會按逆序進行計算,所以,我們每次讀取到一個運算符優(yōu)先級低于棧頂?shù)淖址?,都要先將棧?nèi)的運算符優(yōu)先級高的運算符的結(jié)果算出,從而不影響運算順序),最后,我們的運算符棧內(nèi)如果還剩下元素,直接計算即可。

如何設(shè)計優(yōu)先級問題?

? ? ? ?這里方法就有很多了,既可以用一個專門的函數(shù)來實現(xiàn),也可以用STL的map鍵值來實現(xiàn)等等,這里我們采用第二種方法,該方法比較簡單且代碼易擴展,方便后序添加運算符。

unordered_map<char, int> p{ {'+',1},{'-',1},{'*',2},{'/',2} };//用來表示運算符的優(yōu)先級,數(shù)字越大表示運算優(yōu)先級越高

設(shè)計計算函數(shù)和啟動計算條件

//計算函數(shù)
void f()
{
	//這里需要注意,我們的棧內(nèi)保存的待運算數(shù)字和運算順序是反著的,會影響減法和除法的計算
	auto b = num.top(); num.pop();
	auto a = num.top(); num.pop();
	auto c = op.top(); op.pop();
	if (c == '+')
		num.push(a + b);
	else if (c == '-')
		num.push(a - b);
	else if (c == '*')
		num.push(a * b);
	else if (c == '/')
		num.push(a / b);
	//如果想要再拓展其他運算,可在此處繼續(xù)寫下去

}

//計算啟動條件
else if (s[i] == '(')//如果是左括號,直接入棧等待右括號到來再計算
			op.push(s[i]);
		else if (s[i] == ')')//右括號,準(zhǔn)備開始計算結(jié)果
		{
			while (op.top() != '(') f();//做括號內(nèi)的計算
			op.pop();//彈出左括號
		}
		else
		{
			while (!op.empty() && p[op.top()] >= p[s[i]]) f();//如果遇到優(yōu)先級比前面已經(jīng)入棧的運算符的優(yōu)先極低的,則要先解決棧內(nèi)的計算再將該優(yōu)先級高的字符入棧
			op.push(s[i]);
		}

完整代碼(可做為表達式計算模板使用)

#include<bits/stdc++.h>
#include <unordered_map>
using namespace std;
const int maxn = 1e5 + 10;

stack<int >num;
stack<char> op;//運算符

unordered_map<char, int> p{ {'+',1},{'-',1},{'*',2},{'/',2} };//用來表示運算符的優(yōu)先級,數(shù)字越大表示運算優(yōu)先級越高

void f()
{
	//這里需要注意,我們的棧內(nèi)保存的待運算數(shù)字和運算順序是反著的,會影響減法和除法的計算
	auto b = num.top(); num.pop();
	auto a = num.top(); num.pop();
	auto c = op.top(); op.pop();
	if (c == '+')
		num.push(a + b);
	else if (c == '-')
		num.push(a - b);
	else if (c == '*')
		num.push(a * b);
	else if (c == '/')
		num.push(a / b);
	//如果想要再拓展其他運算,可在此處繼續(xù)寫下去

}
int main()
{
	string s;
	cin >> s;
	for (int i = 0; i < s.size(); i++)
	{
		if (isdigit(s[i]))//注意,這里需要注意10以上的數(shù),不能只看一個字符就完了
		{
			int j = i;
			int temp = 0;
			while (j < s.size() && isdigit(s[j]))
			{
				temp = temp * 10 + s[j++] - '0';
			}
			i = j-1;//j在退出循環(huán)之前已經(jīng)自增了,所以要減去
			num.push(temp);
		}
		else if (s[i] == '(')//如果是左括號,直接入棧等待右括號到來再計算
			op.push(s[i]);
		else if (s[i] == ')')//右括號,準(zhǔn)備開始計算結(jié)果
		{
			while (op.top() != '(') f();//做括號內(nèi)的計算
			op.pop();//彈出左括號
		}
		else
		{
			while (!op.empty() && p[op.top()] >= p[s[i]]) f();//如果遇到優(yōu)先級比前面已經(jīng)入棧的運算符的優(yōu)先極低的,則要先解決棧內(nèi)的計算再將該優(yōu)先級高的字符入棧
			op.push(s[i]);
		}
	}
	//如果最后棧內(nèi)還剩下字符,直接計算即可
	while (op.size()) f();
	printf("%d\n", num.top());

	return 0;
}

? ? ?我們這里將計算函數(shù)和優(yōu)先級單獨設(shè)計,目的就是增加代碼的可復(fù)用性,main函數(shù)內(nèi)部沒有涉及運算符的種類和其他的特殊處理,將特異性的功能封裝成函數(shù)方便后序增添功能。

3.金句頻道

? ? ? ?常常熬不住的時候也想找個靠山靠一下,可怎么找都會發(fā)現(xiàn),有的山長滿荊棘,有的山上全是野獸,所以你應(yīng)該是自己的那座山。過度的依賴總會失掉自我,變得被動,不要總是整天“大佬帶我飛”,讓自己強起來才是一芳永逸的事。要相信每一次普通的改變,都可能改變原本的普通。

表達式求值問題-雙棧模板化實現(xiàn)

?文章來源地址http://www.zghlxwxcb.cn/news/detail-438154.html

到了這里,關(guān)于表達式求值問題-雙棧模板化實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 文本單詞查詢復(fù)合表達式求值的實現(xiàn)案例分析

    文本單詞查詢復(fù)合表達式求值的實現(xiàn)案例分析

    ????????本文討論的“ 文本單詞查詢復(fù)合表達式求值的實現(xiàn) ”案例,來自C++ primer第四版,該案例面向?qū)ο缶幊毯头盒途幊蹋?涉及類的繼承、抽象、多態(tài)、句柄、標(biāo)準(zhǔn)IO庫、容器、算法庫 ,是綜合性很強的程序 ????????該程序?qū)崿F(xiàn)文本中查找單個單詞,“非”查詢(使

    2024年01月23日
    瀏覽(12)
  • 簡易計算器(詳解用棧實現(xiàn)算術(shù)表達式求值)

    [問題描述] 一個算術(shù)表達式是由操作數(shù)(operand)、運算符(operator)和界限符(delimiter)組成的。假設(shè)操作數(shù)是 正實數(shù) ,運算符只含 加減乘除 等四種運算符,界限符只含 左右括號 如:6+15*(21-8/4)。編程利用“ 運算符優(yōu)先法 ”求算術(shù)表達式的值。 [基本要求] (1)讀入一個合法的

    2024年02月08日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)】利用順序棧/鏈棧完成表達式求值(C語言實現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)】利用順序棧/鏈棧完成表達式求值(C語言實現(xiàn))

    利用順序棧完成表達式求值(將字符型轉(zhuǎn)換為整型) 程序代碼: #include stdio.h #include malloc.h #include stdlib.h #include math.h #define MAXSIZE 100 #define ElemType char #define LEN sizeof ( ElemType ) typedef struct { ??? ElemType * data; ??? int top; } SqStack ; void InitStack( SqStack * S ) { ??? S -data = ( ElemType *)

    2024年02月05日
    瀏覽(29)
  • 4.2 實現(xiàn)基于棧的表達式求值計算器(難度4/10)

    4.2 實現(xiàn)基于棧的表達式求值計算器(難度4/10)

    本作業(yè)主要考察:解釋器模式的實現(xiàn)思想/棧結(jié)構(gòu)在表達式求值方面的絕對優(yōu)勢 C++數(shù)據(jù)結(jié)構(gòu)與算法夯實基礎(chǔ)作業(yè)列表 通過棧的應(yīng)用,理解特定領(lǐng)域設(shè)計的關(guān)鍵作用,給大家眼前一亮的感覺。深刻理解計算機語言和人類語言完美結(jié)合的杰作。是作業(yè)中的上等作品,是數(shù)據(jù)結(jié)構(gòu)與

    2024年02月10日
    瀏覽(23)
  • c++表達式求值

    給定一個表達式,其中運算符僅包含 +,-, ,/(加 減 乘 整除),可能包含括號,請你求出表達式的最終值。 注意: 數(shù)據(jù)保證給定的表達式合法。題目保證符號 - 只作為減號出現(xiàn),不會作為負號出現(xiàn),例如,-1+2,(2+2) (-(1+1)+2) 之類表達式均不會出現(xiàn)。題目保表達式中所有數(shù)字均

    2024年01月21日
    瀏覽(21)
  • 棧|逆波蘭表達式求值

    棧|逆波蘭表達式求值

    逆波蘭表達式求值 逆波蘭表達式就是后綴表達式,我們平時寫的帶括號的是中綴表達式。區(qū)分中綴表達式和后綴表達式 就是 操作數(shù) 和 操作符 的先后關(guān)系。 操作符在后 就是后綴表達式 后綴表達式 的用途就是 讓計算機直到計算的先后順序! 比如 我們中綴表達式 a * (b -

    2024年04月11日
    瀏覽(22)
  • 表達式求值和轉(zhuǎn)換

    2024年02月06日
    瀏覽(21)
  • C++ 數(shù)據(jù)結(jié)構(gòu) 棧 中綴表達式轉(zhuǎn)后綴表達式并求值

    C++ 數(shù)據(jù)結(jié)構(gòu) 棧 中綴表達式轉(zhuǎn)后綴表達式并求值

    寫在前面,這里用的是我自己寫的Stack類,并非STL,實現(xiàn)方法為靜態(tài)數(shù)組,但使用過程中的函數(shù)方法一樣,無傷大雅。(完整code和Stack_static類賦在最后) 1.從左到右遍歷 2.數(shù),即參與運算數(shù),直接放進后綴表達式之后 3.左括號 ,直接壓入棧(因為括號的優(yōu)先級最高,無需判斷

    2024年02月03日
    瀏覽(27)
  • 中綴表達式求值(棧的應(yīng)用)

    AcWing算法基礎(chǔ)課-3302.表達式求值 給定一個表達式,其中運算符僅包含 +,-,*,/ (加 減 乘 整除),可能包含括號,請你求出表達式的最終值。 注意: 數(shù)據(jù)保證給定的表達式合法。 題目保證符號 - 只作為減號出現(xiàn),不會作為負號出現(xiàn),例如, -1+2 , (2+2)*(-(1+1)+2) 之類表達式均不

    2024年02月05日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)之表達式求值

    數(shù)據(jù)結(jié)構(gòu)之表達式求值

    ?前言 運用堆棧解決表達式的求值,代碼思路為: 1.定義兩個棧,一個char類型的棧用于存放運算符(ysf)一個int類型的棧用于存放操作數(shù)(czs) 如一個表達式3+6*9,將“+”,“*”入ysf棧,將“3”“6”“9”入czs棧 2.運用getchar進行數(shù)據(jù)的錄入,如果接收的是運算符,將其插入到運

    2024年04月29日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包