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}