控制台第一行打印的数值为使用形如以下方式得到的结果:
1 cout << 200+500*(200+300)*600/709-400 << endl;
即第一个待求解表达式由C++表达式计算所得结果,以用于与实现得出的结果作比较。
第1次测试:
第一个待求解表达式实现得出的结果比由C++表达式计算的结果大1,错误。
第2次测试:
第一个待求解表达式实现得出的结果与由C++表达式计算的结果完全一致;
第3与第5次测试:
实现无法求解取模运算;
第4次测试:
第一个待求解表达式实现得出的结果比由C++表达式计算的结果大1582,错误。
综上所述,实现用于计算一些表达式是正确可行的,而对于另外一些表达式则正确得出结果。另,由实现计算5/3*9与(5/3)*9的结果知:是否添加括号对实现能否正确计算表达式有直接关系。
图1 求解200+500*(200+300)*600/709-400与5/3*9程序运行截图
图2 求解111+56*(789+29)*5/80-400与12+5*(2+3)*6/2-4程序运行截图
图3 求解222+555*(777+111)*666/888-999/333+444+(34%7)与(5/3)*9程序运行截图
图4 求解222+555*(777+111)*666/888-999/333+444+(347)与(5/3)*9程序运行截图
图5 计算222+555*(777+111)*666/888-999/333+444+(347)与9%3程序运行截图
下面上源代码:
存储元素类型为int的顺序栈类C++描述框架:
1 //存储元素类型为int的顺序栈类C++描述框架:
2 // SeqStack1.h: interface for the SeqStack class.
3 //
4 //////////////////////////////////////////////////////////////////////
5
6 #if !defined(AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_)
7 #define AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_
8
9 #if _MSC_VER > 1000
10 #pragma once
11 #endif // _MSC_VER > 1000
12
13 #include "charSeqStack.h"
14
15 typedef double elementType;
16 class SeqStack
17 {
18 public:
19 SeqStack();
20 virtual ~SeqStack();
21 bool stackEmpty();
22 bool stackFull();
23 bool getTop( elementType& value );
24 bool push( elementType value );
25 bool pop();
26 int length();
27 void displayStack();
28 int isp( elementType1 _operator );//栈内优先级
29 int icp( elementType1 _operator );//栈外优先级
30 charSeqStack css;
31 double doOperator( elementType value1, elementType value2, elementType1 _operator );
32 void calculate( char* Str );
33
34 friend ostream &operator<< (ostream &os, const SeqStack &a)
35 {
36 for (int i = 0; i < a.top + 1; i++)
37 {
38 if (a.top == -1)
39 return os;
40 os << a.data[i];
41 }
42
43 return os;
44 }
45
46 private:
47 elementType data[maxLength];
48 int top;
49 };
50
51 #endif // !defined(AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_)
存储元素类型为char的顺序栈类C++描述框架:
1 //存储元素类型为char的顺序栈类C++描述框架:
2 // charSeqStack.h: interface for the charSeqStack class.
3 //
4 //////////////////////////////////////////////////////////////////////
5
6 #if !defined(AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_)
7 #define AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_
8
9 #if _MSC_VER > 1000
10 #pragma once
11 #endif // _MSC_VER > 1000
12
13 typedef char elementType1;
14 const int maxLength = 1000 + 13;
15
16 class charSeqStack
17 {
18 public:
19 charSeqStack();
20 virtual ~charSeqStack();
21 bool stackEmpty();
22 bool stackFull();
23 bool getTop( elementType1& value );
24 bool push( elementType1 value );
25 bool pop();
26 int length();
27 int topValue();
28 void displayStack();
29 friend ostream &operator<< (ostream &os, const charSeqStack &a)
30 {
31 for (int i = 0; i < a.top+2; i++)
32 {
33 if (a.top == -1)
34 return os;
35 os << a.data[i];
36 }
37
38 return os;
39 }
40
41 private:
42 elementType1 data[maxLength];
43 int top;
44 };
45
46
47 #endif // !defined(AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_)
存储元素类型为int的顺序栈类C++实现:
1 //存储元素类型为int的顺序栈类C++实现:
2 // SeqStack1.cpp: implementation of the SeqStack class.
3 //
4 //////////////////////////////////////////////////////////////////////
5
6 #include "stdafx.h"
7 #include "SeqStack.h"
8
9
10 //////////////////////////////////////////////////////////////////////
11 // Construction/Destruction
12 //////////////////////////////////////////////////////////////////////
13
14 SeqStack::SeqStack()
15 {
16 top = -1;
17 }
18
19 SeqStack::~SeqStack()
20 {
21 }
22
23 bool SeqStack::stackEmpty()
24 {
25 return top == -1;
26 }
27
28 bool SeqStack::stackFull()
29 {
30 return top == maxLength - 1;
31 }
32
33 bool SeqStack::getTop( elementType& value )
34 {
35 if( stackEmpty() )
36 {
37 cout << "Õ»¿Õ£¡·ÃÎÊÕ»¶¥ÔªËØʧ°Ü£¡" << endl;
38 return false;
39 }
40 value = data[top];
41 return true;
42 }
43
44 bool SeqStack::push( elementType value )
45 {
46 if( stackFull() )
47 {
48 cout << "Õ»Âú£¡Ñ¹Õ»Ê§°Ü£¡" << endl;
49 return false;
50 }
51 top ++;
52 data[top] = value;
53 return true;
54 }
55
56 bool SeqStack::pop()
57 {
58 if( stackEmpty() )
59 {
60 cout << "Õ»¿Õ£¡µ¯Õ»Ê§°Ü£¡" << endl;
61 return false;
62 }
63 top --;
64 return true;
65 }
66
67 int SeqStack::length()
68 {
69 if( stackEmpty() )
70 {
71 cout << "Õ»¿Õ£¡" << endl;
72 return -1;
73 }
74 return top + 1;
75 }
76
77 void SeqStack::displayStack()
78 {
79 if( stackEmpty() )
80 {
81 cout << "Õ»¿Õ£¡ÎÞ·¨´òÓ¡£¡" << endl;
82 return;
83 }
84 int column = 0;
85 for( int i = 0; i <= top; i ++ )
86 {
87 cout << setw(6) << setiosflags( ios::left ) << data[i];
88 column ++;
89 if( column % 10 == 0 )
90 cout << endl;
91 }
92 }
93
94 int SeqStack::isp( char _operator )
95 {
96 switch(_operator)
97 {
98 case '#' :
99 return 0;
100 break;
101 case '(':
102 return 6;
103 break;
104 case '*':
105 return 5;
106 break;
107 case '/':
108 return 5;
109 break;
110 case '+':
111 return 3;
112 break;
113 case '-':
114 return 3;
115 break;
116 case ')':
117 return 1;
118 break;
119 }
120
121 cerr << "Error in SeqStack::isp" << endl;
122 return -1;
123 }
124
125 int SeqStack::icp( char _operator )
126 {
127 switch(_operator)
128 {
129 case '#' :
130 return 0;
131 break;
132 case '(':
133 return 1;
134 break;
135 case '*':
136 return 4;
137 break;
138 case '/':
139 return 4;
140 break;
141 case '+':
142 return 2;
143 break;
144 case '-':
145 return 2;
146 break;
147 case ')':
148 return 6;
149 break;
150 }
151
152 cerr << "Error in SeqStack::icp" << endl;
153 return -1;
154 }
155
156 double SeqStack::doOperator( elementType value1, elementType value2, elementType1 _operator )
157 {
158 switch(_operator)
159 {
160 case '+':
161 return value1 + value2;
162 break;
163 case '-':
164 return value1 - value2;
165 break;
166 case '*':
167 return value1 * value2;
168 break;
169 case '/':
170 if( fabs(value2) < 0.0001 )
171 {
172 cout << "Divided by 0!" << endl;
173 return -1000000;
174 }
175 else
176 return value1 / value2;
177 break;
178 }
179
180 cerr << "Error in SeqStack::doOperator" << endl;
181 return -1;
182 }
183
184 void SeqStack::calculate( char* Str )
185 {
186 charSeqStack css1;
187 char ch1;
188 int i = 0;
189 double a, b;
190
191 int level = 0;
192 int temp = 0;
193
194 while ( Str[i] != '\0' )
195 {
196 i ++;
197 }
198 i = i - 2;
199 while( css1.topValue() != -1 || Str[i] != '#' )
200 {
201 char ch = Str[i];
202 if ( isdigit(ch) )
203 {
204 temp = temp + pow( 10, level ) * int( ch - '0' );
205 level ++;
206 i --;
207 }
208 else
209 {
210 if (level)
211 {
212 push(temp);
213 temp = 0;
214 level = 0;
215 }
216 css1.getTop(ch1);
217 if ( ch1 == ')' && ch == '(' )
218 {
219 css1.pop();
220 i --;
221 continue;
222 }
223 if ( isp(ch1) < icp(ch) )
224 {
225 css1.push(ch);
226 i --;
227 }
228 else if (isp(ch1) >= icp(ch))
229 {
230 getTop(a);
231 pop();
232 getTop(b);
233 pop();
234 push( doOperator( a, b, ch1 ) );
235 css1.pop();
236 }
237 }
238 }
239
240 if (level)
241 {
242 push(temp);
243 }
244
245 }
存储元素类型为char的顺序栈类C++实现:
1 //存储元素类型为char的顺序栈类C++实现:
2
3 // charSeqStack.cpp: implementation of the charSeqStack class.
4 //
5 //////////////////////////////////////////////////////////////////////
6
7 #include "stdafx.h"
8 #include "charSeqStack.h"
9
10
11 using namespace std;
12 //////////////////////////////////////////////////////////////////////
13 // Construction/Destruction
14 //////////////////////////////////////////////////////////////////////
15
16 charSeqStack::charSeqStack()
17 {
18 top = -1;
19 }
20
21 charSeqStack::~charSeqStack()
22 {
23
24 }
25
26 bool charSeqStack::stackEmpty()
27 {
28 return top == -1;
29 }
30
31 bool charSeqStack::stackFull()
32 {
33 return top == maxLength - 1;
34 }
35
36 bool charSeqStack::getTop( elementType1& value )
37 {
38 ios::sync_with_stdio(false);
39 if( stackEmpty() )
40 {
41 value = '#';
42 //cout << "Õ»¿Õ£¡·ÃÎÊÕ»¶¥ÔªËØʧ°Ü£¡charSeqStack" << endl;
43 return false;
44 }
45 value = data[top];
46 return true;
47 }
48
49 bool charSeqStack::push( elementType1 value )
50 {
51 ios::sync_with_stdio(false);
52 if( stackFull() )
53 {
54 cout << "Õ»Âú£¡Ñ¹Õ»Ê§°Ü£¡" << endl;
55 return false;
56 }
57 top ++;
58 data[top] = value;
59 return true;
60 }
61
62 bool charSeqStack::pop()
63 {
64 if( stackEmpty() )
65 {
66 cout << "Õ»¿Õ£¡µ¯Õ»Ê§°Ü£¡" << endl;
67 return false;
68 }
69 top --;
70 return true;
71 }
72
73 int charSeqStack::length()
74 {
75 if( stackEmpty() )
76 {
77 cout << "Õ»¿Õ£¡" << endl;
78 return -1;
79 }
80 return top + 1;
81 }
82
83 void charSeqStack::displayStack()
84 {
85 if( stackEmpty() )
86 {
87 cout << "Õ»¿Õ£¡ÎÞ·¨´òÓ¡£¡" << endl;
88 return;
89 }
90 int column = 0;
91 for( int i = 0; i <= top; i ++ )
92 {
93 cout << setw(6) << setiosflags( ios::left ) << data[i];
94 column ++;
95 if( column % 10 == 0 )
96 cout << endl;
97 }
98 }
99
100 int charSeqStack::topValue()
101 {
102 return top;
103 }