利用C++的STL和堆栈编程思想实现数学四则运算计算结果.docx

上传人:b****1 文档编号:22813317 上传时间:2023-04-28 格式:DOCX 页数:17 大小:73.51KB
下载 相关 举报
利用C++的STL和堆栈编程思想实现数学四则运算计算结果.docx_第1页
第1页 / 共17页
利用C++的STL和堆栈编程思想实现数学四则运算计算结果.docx_第2页
第2页 / 共17页
利用C++的STL和堆栈编程思想实现数学四则运算计算结果.docx_第3页
第3页 / 共17页
利用C++的STL和堆栈编程思想实现数学四则运算计算结果.docx_第4页
第4页 / 共17页
利用C++的STL和堆栈编程思想实现数学四则运算计算结果.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

利用C++的STL和堆栈编程思想实现数学四则运算计算结果.docx

《利用C++的STL和堆栈编程思想实现数学四则运算计算结果.docx》由会员分享,可在线阅读,更多相关《利用C++的STL和堆栈编程思想实现数学四则运算计算结果.docx(17页珍藏版)》请在冰豆网上搜索。

利用C++的STL和堆栈编程思想实现数学四则运算计算结果.docx

利用C++的STL和堆栈编程思想实现数学四则运算计算结果

  在数学的四则运算表达式写入a.txt中,例如:

  其运算的结果要写入b.txt中,例如

  初探思路:

  利用getline读取文件中每行,并保存在string中,然后按数字和运算符拆分成两个vector。

  第一次遍历,把*、/、%等运算符等级高的运算

  剩下的就循环遍历运算+和-,直到vector中的第二个字符是=,把第一个字符的结果存入一个answer中,

  执行上面相同的操作,计算每行的表达式,把结果存入answer中

  最后把answer的结果存入到b.txt中

 

附上代码:

1//Demo.cpp:

定义控制台应用程序的入口点。

2//

3

4#include"stdafx.h"

5#include

6#include

7#include

8#include

9#include

10#include

11

12usingnamespacestd;

13

14

15voidwriteAnswer(vector&iAnswer)

16{

17ofstreamofs("b.txt");

18for(vector:

:

size_typeix=0;ix!

=iAnswer.size();ix++)

19{

20ofs<

21}

22ofs.close();

23}

24

25voidcountAnswer(vector&iAnswer,vector&iVec,vector&cVec)

26{

27for(vector:

:

size_typeiy=0;iy!

=cVec.size();iy++)

28{

29vector:

:

size_typet=cVec.size();

30switch(cVec[iy])

31{www.ipb.cc

32case'*':

33iVec[iy]*=iVec[iy+1];

34iVec.erase(iVec.begin()+iy+1);

35cVec.erase(cVec.begin()+iy);

36iy--;

37break;

38case'/':

39iVec[iy]/=iVec[iy+1];

40iVec.erase(iVec.begin()+iy+1);

41cVec.erase(cVec.begin()+iy);

42iy--;

43break;

44case'%':

45iVec[iy]%=iVec[iy+1];

46iVec.erase(iVec.begin()+iy+1);

47cVec.erase(cVec.begin()+iy);

48iy--;

49break;

50}

51}

52

53intn;

54n=iVec[0];

55for(vector:

:

size_typeix=0;ix!

=cVec.size();ix++)

56{

57vector:

:

size_typet=cVec.size();

58switch(cVec[ix])

59{

60case'+':

61n+=iVec[ix+1];

62break;

63case'-':

64n-=iVec[ix+1];

65break;

66}

67}

68iAnswer.push_back(n);

69

70

71}

72

73

74voidcountMath()

75{

76ifstreamifs("a.txt");

77stringtemp;

78dequesDeq;

79while(!

ifs.eof())

80{

81getline(ifs,temp);

82sDeq.push_back(temp);

83}

84

85ifs.close();

86

87

88vectoriAnswer;

89for(deque:

:

size_typeix=0;ix!

=sDeq.size();ix++)

90{

91stringstr;

92str=sDeq.front();

93inttemp=0;

94vectoriVec;

95vectorcVec;

96for(string:

:

size_typeiy=0;iy!

=str.size();iy++)

97{

98if(str[iy]=='=')

99{

100iVec.push_back(temp);

101temp=0;

102countAnswer(iAnswer,iVec,cVec);

103break;

104}

105elseif(str[iy]>='0'&&str[iy]<='9')

106{

107temp=str[iy]-'0'+temp*10;

108}

109else

110{

111iVec.push_back(temp);

112temp=0;

113cVec.push_back(str[iy]);

114}

115}

116iVec.clear();

117cVec.clear();

118

119}

120

121writeAnswer(iAnswer);

122}

123

124int_tmain(intargc,_TCHAR*argv[])

125{

126countMath();

127return0;

128}

此次修改了上次的版本,利用了堆栈的编程思想,实现了支持括号的四则运算

跟上个版本一样,吧表达式存储到a.txt中:

结果保存在b.txt中:

 

堆栈编程思路:

1.建立两个堆,一个字符堆,用于存储+、-、*、/、%、=;一个数字堆,用于存储数字

2.创建两个字符,一个存储堆顶的操作符,一个存储表达式中的操作符

3.建立一个二维表,利用2.中的两个操作符转化为行和列,在二维表中找到对应的判断

4.若是小于,则表示,表达式中的操作符优先级比原先的操作符优先级高,直接压入堆中存储

5.若是大于,则表示堆顶的操作符优先级高,所以先计算,把数字堆中的两个数弹出,计算结果,压回堆中存储,并把表达式中的操作符压入字符堆中

6.若为0,则表示表达式不合法

7.若为=,则有两种情况,一个是表达式计算完成,把结果存储到answer中。

另外一种是括号配对了,需要把前括号pop了

 

以上是主思路,次思路跟上次一样:

1.打开a.txt;

2.利用getline吧每行的表达式读出来,存入string类对象中;

3.循环读取,循环计算结果;

4.循环完成,把answer中的结果存储到b.txt;

 

差不多就这样,下面附上代码:

1//Arithmetic3.cpp:

定义控制台应用程序的入口点。

2//

3

4#include"stdafx.h"

5#include

6#include

7#include

8#include

9#include

10#include

11#include

12

13usingnamespacestd;

14

15//+-*/%()=

16charss[8][8]={{'>','>','<','<','<','<','>','>'},

17{'>','>','<','<','<','<','>','>'},

18{'>','>','>','>','>','<','>','>'},

19{'>','>','>','>','>','<','>','>'},

20{'>','>','>','>','>','<','>','>'},

21{'<','<','<','<','<','<','=','0'},

22{'>','>','>','>','>','0','>','>'},

23{'<','<','<','<','<','<','0','='}};

24//大于号,弹出数字,进行计算,小于号,压入堆栈中

25

26//把字符转化成相应的行和列

27voidgetRowCol(constcharstackCh,constcharch,int&row,int&col)

28{

29switch(stackCh)

30{

31case'+':

32row=0;

33break;

34case'-':

35row=1;

36break;

37case'*':

38row=2;

39break;

40case'/':

41row=3;

42break;

43case'%':

44row=4;

45break;

46case'(':

47row=5;

48break;

49case')':

50row=6;

51break;

52case'=':

53row=7;

54break;

55}

56switch(ch)

57{

58case'+':

59col=0;

60break;

61case'-':

62col=1;

63break;

64case'*':

65col=2;

66break;

67case'/':

68col=3;

69break;

70case'%':

71col=4;

72break;

73case'(':

74col=5;

75break;

76case')':

77col=6;

78break;

79case'=':

80col=7;

81break;

82}

83

84}

85

86//写入文件

87voidwriteAnswer(vector&iAnswer)

88{

89ofstreamofs("b.txt");

90for(vector:

:

size_typeix=0;ix!

=iAnswer.size();ix++)

91{

92ofs<

93}

94ofs.close();

95}

96

97

98voidcountAnswer(vector&iAnswer,string&str)

99{

100inttemp=0;

101introw=0,col=0;

102stackiStk;//定义数据堆

103stackcStk;//定义字符堆

104charstackCh='\0';

105charch='\0';

106cStk.push('=');//先把=压入字符堆中,以备匹配等号

107for(string:

:

size_typeix=0;ix!

=str.size();ix++)

108{

109//如果是数字,先判断下一个字符是否也是数字,如果不是,就压入数据堆中

110if(str[ix]>='0'&&str[ix]<='9')

111{

112temp=str[ix]-'0'+temp*10;

113if(str[ix+1]<'0'||str[ix+1]>'9')

114{

115iStk.push(temp);

116}

117}

118else

119{

120/*iStk.push(temp);*/

121temp=0;

122stackCh=cStk.top();//弹出字符堆的堆顶字符

123ch=str[ix];//读取字符串中的字符

124if(ch=='='||ch==')')//遇到=号,或者),先执行判断

125{

126ix--;

127}

128getRowCol(stackCh,ch,row,col);////把字符转化成相应的行和列

129switch(ss[row][col])

130{

131case'=':

//遇到括号匹配,或者=号匹配,计算结束

132if(ch=='=')

133{

134iAnswer.push_back(iStk.top());

135return;

136}

137else

138{

139cStk.pop();

140ix++;

141}

142

143break;

144case'>':

//取出堆中的两个数据,执行计算

145{

146intnum2=iStk.top();

147iStk.pop();

148intnum1=iStk.top();

149iStk.pop();

150stackCh=cStk.top();

151cStk.pop();

152if(ch!

='='&&ch!

=')')

153{

154cStk.push(ch);

155}

156switch(stackCh)

157{

158case'+':

159num1+=num2;

160break;

161case'-':

162num1-=num2;

163break;

164case'*':

165num1*=num2;

166break;

167case'/':

168num1/=num2;

169break;

170case'%':

171num1%=num2;

172break;

173}

174iStk.push(num1);

175break;

176}

177case'<':

//压入堆中

178cStk.push(ch);

179break;

180case'0':

//表达式错误

181cout<<"errorarithmetic"<

182return;

183}

184}

185}

186}

187

188

189voidcountMath()

190{

191ifstreamifs("a.txt");

192if(!

ifs.is_open())

193{

194ifs.clear();

195fstreamfs("a.txt",ios_base:

:

out);//如果打开失败就创建文件a.txt

196fs.close();

197ifs.open("a.txt");

198}

199stringtemp;

200dequesDeq;

201while(!

ifs.eof())

202{

203getline(ifs,temp);//按行读取数据,存储到双端队列中

204sDeq.push_back(temp);

205}

206

207ifs.close();

208

209vectoriAnswer;

210for(deque:

:

size_typeix=0;ix!

=sDeq.size();ix++)

211{

212stringstr;

213str=sDeq.front();

214sDeq.pop_front();

215ix--;

216//计算每一行的表达式

217countAnswer(iAnswer,str);

218}

219

220writeAnswer(iAnswer);

221}

222

223int_tmain(intargc,_TCHAR*argv[])

224{

225countMath();

226return0;

227}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 教育学心理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1