算術表示式解析(第二版) C 11版

2022-03-22 00:09:08 字數 2007 閱讀 1446

//乙個簡單的計算器**,主要用來練習c++11新標準的程式設計技術和stl應用

1 #include2 #include3 #include4 #include

5 #include6 #include

7using

namespace

std;89

10 typedef functionoptionfun;

11 stacksnumber;

12 stacksoption;

13 mapoptfunmap;

14 mapoptweightmap;

1516

#define declare_opt(opts,preority) \

17 optweightmap[#opts] = int

(preority);\

18 optfunmap[#opts] = bind((float a, float b), placeholders::_1, placeholders::_2);

1920

21void

init_option()

2228

29bool isoption(string

op)30

34float recognize_float(const

char* pstr, int&width)35;

37int dotcount = 0;38

for(int i=0;pstr[i]!='

\0';i++)

3946

else

4751}52

return

atof(value);53}

5455

//offset from '(' to ')'

56int check_match(const

char*str)

5767}68

return match?offset:-1;69

}7071void

handle_stack()

7281 auto it =optfunmap.find(opt);

82if(it !=optfunmap.end())

8392}93

}94float calc(const

char*str)

95101

102if(*str=='

+'||*str=='-'

)103

106while(*str!='\0'

)107

115if(*str=='('

)116

123 soption.push("("

);124 calc(str+1

);125 str +=len;

126continue

;127

}128

if(*str==')'

)129

133string ops(1,*str);

134if

(isoption(ops))

135142

}143

soption.push(ops);

144 str++;

145continue

;146

}147 cout<<"

invalid express

"<148return0;

149}

150handle_stack();

151return

snumber.top();

152}

153int

main()

154164

return0;

165 }

這個計算器去年也寫了乙個,這次**少了將近一半,說明還是有進步的……下次再少一點就好了,因為現在看上去還是有一些不和諧的東西,比如float型別的限制、括號處理分在了兩個函式裡面等。

用棧解析算術表示式 Python版

中採用了三步實現算術表示式的解析 1.將算術表示式 字串 轉換成乙個列表parseelement方法 2.將列表表示的算術表示式轉換成字尾表示式changetosuffix 3.計算字尾表示式的結果 這裡我是為了方便,就寫了個parseelement,不想那方法寫到後面卻把自己繞住了,可以想象乙個帶...

四則表示式計算模板第二版

四則表示式計算模板第二版 女孩 本版除了修正上乙個版本的bug之外,核心是重寫的,使得結構更為緊密,更為短小 格式方面就將就一下吧。include define is equ s,a,b,c,d s a s b s c s d define in n if st 4 yzfy yzfy getval...

C程式語言(第二版) 1 8

1 8輸出所輸入字元中空格,製表符,換行符的個數 includevoid main printf 空格 d t製表符 d回車 t d n space,table,enter 1.換行符 n 與回車符 r 不是一回事兒,換行符ascii為10,回車符的ascii為13 2.換行符就是另起一行,回車符就...