C++实现顺序栈类求解中缀表达式的计算

       控制台第一行打印的数值为使用形如以下方式得到的结果:

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 + 1; 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] != '' )
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 }
原文地址:https://www.cnblogs.com/25th-engineer/p/9859887.html