1. 程式人生 > >資料結構實驗3:C++實現順序棧類與鏈棧類

資料結構實驗3:C++實現順序棧類與鏈棧類

                                                                                          實驗3

 
3.1 實驗目的

熟練掌握棧的順序儲存結構和鏈式儲存結構。

熟練掌握棧的有關演算法設計,並在順序棧和鏈棧上實現。

根據具體給定的需求,合理設計並實現相關結構和演算法。
3.2實驗要求
3.2.1 順序棧的實驗要求

順序棧結構和運算定義,演算法的實現以庫檔案方式實現,不得在測試主程式中直接實現;

實驗程式有較好可讀性,各運算和變數的命名直觀易懂,符合軟體工程要求;

程式有適當的註釋。
3.2.2 鏈棧實驗要求

本次實驗中的鏈棧結構指帶頭結點的單鏈表;

鏈棧結構和運算定義,演算法的實現以庫檔案方式實現,不得在測試主程式中直接實現;

實驗程式有較好可讀性,各運算和變數的命名直觀易懂,符合軟體工程要求;

程式有適當的註釋。
3.3 實驗任務

3.3.1 順序棧實驗任務

設計並實現一個順序棧,編寫演算法實現下列問題的求解。

<1>利用順序棧實現將10進位制數轉換為16進位制數。

第一組資料:4 / 4

第二組資料:11 / B

第三組資料:254 / FE

第四組資料:1357 / 54D

<2>對一個合法的數學表示式來說,其中的各大小括號“{”,“}”,“[”,“]”,“(”和“)”應是相互匹配的。設計演算法對以字串形式讀入的表示式S,判斷其中的各括號是否是匹配的。
3.3.2 鏈棧實驗任務

以帶頭結點的單鏈表表示鏈棧,編寫演算法實現下列問題的求解。

<1>利用順序棧實現將10進位制數轉換為16進位制數。

第一組資料:4

第二組資料:11

第三組資料:254

第四組資料:1357

<2>對一個合法的數學表示式來說,其中的各大小括號“{”,“}”,“[”,“]”,“(”和“)”應是相互匹配的。設計演算法對以字串形式讀入的表示式S,判斷其中的各括號是否是匹配的。
3.4 選做題


非必做內容,有興趣的同學選做。自行選擇棧的儲存結構。

<1>假設棧的輸入序列為1、2、3、...、n,設計演算法實現對給定的一個序列,判定其是否是此棧合法的輸出序列。

<2>假設棧的輸入序列為1、2、3、...、n,設計演算法求出所有可能的出棧序列。

<3>利用棧求解算術表示式的值。
3.5 執行結果截圖及說明

圖1 順序棧實現十進位制轉十六進位制

 

圖2 順序棧解決表示式括號匹配問題(區域性)

 

圖3 順序棧解決表示式括號匹配問題(區域性)

 

圖4 順序棧解決表示式括號匹配問題(區域性)

 

圖5 順序棧解決表示式括號匹配問題(區域性)

 

圖6 鏈棧實現十進位制轉十六進位制

 

圖7 鏈棧解決表示式括號匹配問題(區域性)

 

圖8 鏈棧解決表示式括號匹配問題(區域性)

 

圖9 鏈棧解決表示式括號匹配問題(區域性)

 

圖10 鏈棧解決表示式括號匹配問題(區域性)

 

圖11 鏈棧判斷1、2、3、4排列中合法出棧序列的問題

 

圖12 鏈棧解決輸出1、2、3、4、5、6、7全排列中合法出棧序列的問題(放大可清晰觀看)

 

圖13 鏈棧中綴表示式求值問題

 

3.6 附原始碼

順序棧程式碼:

 1 // stdafx.h : include file for standard system include files,
 2 //  or project specific include files that are used frequently, but
 3 //      are changed infrequently
 4 //
 5 
 6 #if !defined(AFX_STDAFX_H__F1CE48FC_1D41_45D9_B60D_6D065D91DB10__INCLUDED_)
 7 #define AFX_STDAFX_H__F1CE48FC_1D41_45D9_B60D_6D065D91DB10__INCLUDED_
 8 
 9 #if _MSC_VER > 1000
10 #pragma once
11 #endif // _MSC_VER > 1000
12 
13 #include <stdc++.h>
14 
15 using namespace std;
16 
17 //typedef int elementType;
18 typedef double elementType;
19 typedef char elementType1;
20 const int maxLength = 1000 + 3;
21 
22 // TODO: reference additional headers your program requires here
23 
24 //{{AFX_INSERT_LOCATION}}
25 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
26 
27 #endif // !defined(AFX_STDAFX_H__F1CE48FC_1D41_45D9_B60D_6D065D91DB10__INCLUDED_)

 

 

 1 // SeqStack1.h: interface for the SeqStack class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4 
 5 #if !defined(AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_)
 6 #define AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_
 7 
 8 #if _MSC_VER > 1000
 9 #pragma once
10 #endif // _MSC_VER > 1000
11 
12 #include "charSeqStack.h"
13 
14 //using elementType = double;
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( charSeqStack& css1, charSeqStack& css2 );
33     friend ostream &operator<< (ostream &os, const SeqStack &a)
34     {
35         for (int i = 0; i < a.top + 1; i++)
36         {
37             if (a.top == -1)
38                 return os;
39             os << a.data[i];
40         }
41 
42         return os;
43     }
44 
45 private:
46     elementType data[maxLength];
47     int top;
48 };
49 
50 #endif // !defined(AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_)

 

  1 // SeqStack1.cpp: implementation of the SeqStack class.
  2 //
  3 //////////////////////////////////////////////////////////////////////
  4 
  5 #include "stdafx.h"
  6 #include "SeqStack1.h"
  7 #include <iostream>
  8 #include <iomanip>
  9 
 10 //////////////////////////////////////////////////////////////////////
 11 // Construction/Destruction
 12 //////////////////////////////////////////////////////////////////////
 13 using namespace std;
 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( charSeqStack& css1, charSeqStack& css2 )//?????? css2 ?им????????? css1 ?
185 {
186     char ch, ch1;
187     int i = 0, j = 0;
188     double a, b;
189     css2.pop();
190     css2.getTop(ch);
191     css2.pop();
192     
193     // when the top of css2 is not '#' or the top of css is not empty.
194     while( css1.topValue() != -1 || ch != '#' )
195     {
196         // when the top of css2 is a number, put it into ss1
197         if( isdigit(ch) )
198         {
199             push( (int)( ch - '0' ) );
200             css2.getTop(ch);
201             css2.pop();
202         }
203 
204         // when the top of css2 is not a number,
205         else
206         {
207             css1.getTop(ch1);
208             if (ch1 == ')' && ch == '(')
209             {
210                 css1.pop();
211                 css2.getTop(ch);
212                 css2.pop();
213                 continue;
214             }
215             if( isp(ch1) < icp(ch) )
216             {
217                 css1.push(ch);
218                 css2.getTop(ch);
219                 css2.pop();
220             }
221             else if( isp(ch1) >= icp(ch) )
222             {
223                 getTop(a);
224                 pop();
225                 getTop(b);
226                 pop();
227                 push( doOperator( a, b, ch1 ) );
228                 css1.pop();
229             }            
230         }
231 
232     }
233      
234 }

 

 1 // charSeqStack.h: interface for the charSeqStack class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4 
 5 #if !defined(AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_)
 6 #define AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_
 7 
 8 #if _MSC_VER > 1000
 9 #pragma once
10 #endif // _MSC_VER > 1000
11 
12 #include <iostream>
13 using namespace std;
14 //using elementType1 = char;
15 typedef char elementType1;
16 //const int maxLength = 1000;
17 
18 class charSeqStack  
19 {
20 public:
21     charSeqStack();
22     virtual ~charSeqStack();
23     bool stackEmpty();
24     bool stackFull();
25     bool getTop( elementType1& value );
26     bool push( elementType1 value );
27     bool pop();
28     int length();
29     int topValue();
30     void displayStack();
31     friend ostream &operator<< (ostream &os, const charSeqStack &a)
32     {
33         for (int i = 0; i < a.top+2; i++)
34         {
35             if (a.top == -1)
36                 return os;
37             os << a.data[i];
38         }
39 
40         return os;
41     }
42 
43 private:
44     elementType1 data[maxLength];
45     int top;
46 };
47 
48 
49 #endif // !defined(AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_)

 

  1 // charSeqStack.cpp: implementation of the charSeqStack class.
  2 //
  3 //////////////////////////////////////////////////////////////////////
  4 
  5 #include "stdafx.h"
  6 #include "charSeqStack.h"
  7 #include <iostream>
  8 #include <iomanip>
  9 
 10 using namespace std;
 11 //////////////////////////////////////////////////////////////////////
 12 // Construction/Destruction
 13 //////////////////////////////////////////////////////////////////////
 14 
 15 charSeqStack::charSeqStack()
 16 {
 17     top = -1;
 18 }
 19 
 20 charSeqStack::~charSeqStack()
 21 {
 22 
 23 }
 24 
 25 bool charSeqStack::stackEmpty()
 26 {
 27     return top == -1;
 28 }
 29 
 30 bool charSeqStack::stackFull()
 31 {
 32     return top == maxLength - 1;
 33 }
 34 
 35 bool charSeqStack::getTop( elementType1& value )
 36 {
 37     if( stackEmpty() )
 38     {
 39         value = '#';
 40         cout << "???ив????????ив" << endl;
 41         return false;
 42     }
 43     value = data[top];
 44     return true;
 45 }
 46 
 47 bool charSeqStack::push( elementType1 value )
 48 {
 49     if( stackFull() )
 50     {
 51         cout << "?и▓ив????ив" << endl;
 52         return false;
 53     }
 54     top ++;
 55     data[top] = value;
 56     return true;
 57 }
 58 
 59 bool charSeqStack::pop()
 60 {
 61     if( stackEmpty() )
 62     {
 63         cout << "??ив????ив" << endl;
 64         return false;
 65     }
 66     top --;
 67     return true;
 68 }
 69 
 70 int charSeqStack::length()
 71 {
 72     if( stackEmpty() )
 73     {
 74         cout << "??ив" << endl;
 75         return -1;
 76     }
 77     return top + 1;
 78 }
 79 
 80 void charSeqStack::displayStack()
 81 {
 82     if( stackEmpty() )
 83     {
 84         cout << "??ив????ив" << endl;
 85         return;
 86     }
 87     int column = 0;
 88     for( int i = 0; i <= top; i ++ )
 89     {
 90         cout << setw(6) << setiosflags( ios::left ) << data[i];
 91         column ++;
 92         if( column % 10 == 0 )
 93             cout << endl;
 94     }
 95 }
 96 
 97 int charSeqStack::topValue()
 98 {
 99     return top;
100 }

 

 1 // SeqStack.cpp : Defines the entry point for the console application.
 2 //
 3 
 4 #include "stdafx.h"
 5 #include "SeqStack1.h"
 6 #include <iostream>
 7 
 8 using namespace std;
 9 int main(int argc, char* argv[])
10 {
11     SeqStack ss1;
12     ss1.push(0);
13     charSeqStack css1, css2;
14     char Str[] = "#2+5*(2+3)*6/2-4#";
15     //12+5*(2+3)*6/2-4
16     //char Str[] = "#(1+(5-3)*2+9)/2#";
17     //char Str[] = "#(1+2)*3#";
18     //char Str[] = "#(1)#";
19     //char Str[] = "#1*2+3#";
20     //char Str[] = "#1+1#";
21     //char Str[] = "#1#";
22     for( int i = 0; Str[i] != '\0'; i ++ )
23         css2.push( Str[i] );
24 
25     cout << "Start Calculation." << endl;
26     cout << "expression:" << css2 << endl;
27     ss1.calculate( css1, css2 );
28     cout << "Calculation Done!" << endl;
29 
30     double x;
31     if( ss1.getTop(x) )
32         cout << x << endl;
33     cin.get();
34     return 0;
35 }

 

鏈棧程式碼:

 1 // stdafx.h : include file for standard system include files,
 2 //  or project specific include files that are used frequently, but
 3 //      are changed infrequently
 4 //
 5 
 6 #if !defined(AFX_STDAFX_H__2FE69ABE_CC01_4962_8147_FD6E39302FE4__INCLUDED_)
 7 #define AFX_STDAFX_H__2FE69ABE_CC01_4962_8147_FD6E39302FE4__INCLUDED_
 8 
 9 #if _MSC_VER > 1000
10 #pragma once
11 #endif // _MSC_VER > 1000
12 
13 #include <stdc++.h>
14 
15 using namespace std;
16 
17 typedef double elementType;
18 typedef char elementType1;
19 
20 typedef struct node
21 {
22     elementType data;
23     struct node *link;
24 }LStack, *PStack;
25 
26 typedef struct Node
27 {
28     elementType1 data;
29     struct Node *link;
30 }CLStack, *CPStack;
31 
32 typedef long ll;
33 
34 // TODO: reference additional headers your program requires here
35 
36 //{{AFX_INSERT_LOCATION}}
37 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
38 
39 #endif // !defined(AFX_STDAFX_H__2FE69ABE_CC01_4962_8147_FD6E39302FE4__INCLUDED_)

 

 1 // linkedStack.h: interface for the linkedStack class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4 
 5 #if !defined(AFX_LINKEDSTACK_H__54B665DE_2CE8_4329_AED9_95FEAAAAE128__INCLUDED_)
 6 #define AFX_LINKEDSTACK_H__54B665DE_2CE8_4329_AED9_95FEAAAAE128__INCLUDED_
 7 
 8 #if _MSC_VER > 1000
 9 #pragma once
10 #endif // _MSC_VER > 1000
11 
12 #include "charLinkedStack.h"
13 
14 class linkedStack  
15 {
16 public:
17     linkedStack();
18     virtual ~linkedStack();
19     bool stackEmpty();
20     //bool stackFull();
21     bool getTop( elementType& value );
22     bool push( elementType value );
23     bool pop();
24     int length();
25     void displayStack();
26     int isp( char  _operator );//棧內優先順序
27     int icp( char _operator );//棧外優先順序
28     double doOperator( elementType value1, elementType value2, char _operator );
29     void calculate( char* Str );
30     charLinkedStack cls;
31     bool isPopOrder();
32     bool judge(const elementType *sour, int s1, const elementType *dest, int s2 );
33     void linkedStack::printValidPopStackSequence( int n, elementType *A, int cur );
34     friend ostream &operator<< ( ostream &os, const linkedStack &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         LStack *tmp = a.top;
43         int column = 0;
44         while( tmp->link )
45         {
46             //cout << tmp->data << " ";
47             if( tmp->link == NULL )
48                 return os;
49                 //break;
50             //os << tmp->data << " ";
51             os << setw(7) << setiosflags(ios::left) << tmp->data << " ";
52             column ++;
53             if( column % 10 == 0 )
54                 os << setw(7) << setiosflags(ios::left) << endl;
55             tmp = tmp->link;
56         }
57         os << endl;
58 
59         return os;
60     }
61 private:
62     LStack *top;
63     int len;
64 };
65 
66 #endif // !defined(AFX_LINKEDSTACK_H__54B665DE_2CE8_4329_AED9_95FEAAAAE128__INCLUDED_)

 

  1 // linkedStack.cpp: implementation of the linkedStack class.
  2 //
  3 //////////////////////////////////////////////////////////////////////
  4 
  5 #include "stdafx.h"
  6 #include "linkedStack.h"
  7 
  8 //////////////////////////////////////////////////////////////////////
  9 // Construction/Destruction
 10 //////////////////////////////////////////////////////////////////////
 11 
 12 linkedStack::linkedStack()
 13 {
 14     top = new LStack;
 15     if( !top )
 16     {
 17         cerr << "Space allocating falied!Error in linkedStack::linkedStack()!" << endl;
 18     }
 19     top->link = NULL;
 20     //top = NULL;
 21     len = 0;
 22 }
 23 
 24 linkedStack::~linkedStack()
 25 {
 26     /*
 27     LStack *tmp = top;
 28     while( tmp->link )
 29     {
 30         LStack *q = tmp;
 31 
 32         tmp = tmp->link;
 33         delete q;
 34         
 35         len --;
 36     }    
 37     tmp->link = NULL;
 38     */
 39     while(top)
 40     {
 41         LStack *q = top;
 42         top = top->link;
 43         delete q;
 44     }
 45     top = NULL;
 46 }
 47 
 48 bool linkedStack::stackEmpty()
 49 {
 50     //follow style is not suitable for the code
 51     //return top == NULL;
 52     return top->link == NULL;
 53 }
 54 
 55 bool linkedStack::getTop( elementType& value )
 56 {
 57     if( stackEmpty() )
 58     {
 59         cerr << "Stack is Empty!Error in linkedStack::getTop!" << endl;
 60         //value = -1;
 61         return false;
 62     }
 63     value = top->data;
 64     return false;
 65 }
 66 
 67 bool linkedStack::push( elementType value )
 68 {
 69     LStack *newNode = new LStack;
 70     if( !newNode )
 71     {
 72         cerr << "Space allocating falied!" << endl;
 73         return false;
 74     }
 75     newNode->data = value;
 76     newNode->link = top;
 77     top = newNode;
 78     len ++;
 79     return true;
 80 }
 81 
 82 bool linkedStack::pop()
 83 {
 84     if( stackEmpty() )
 85     {
 86         cerr << "Stack is empty!Error in linkedStack::pop()!" << endl;
 87         return false;
 88     }
 89     LStack *tmp = top;
 90     
 91     top = top->link;
 92     delete tmp;
 93     len --;
 94     return true;
 95 }
 96 
 97 int linkedStack::length()
 98 {
 99     if( stackEmpty() )
100     {
101         cerr << "Stack is empty!Error in linkedStack::length()" << endl;
102         return -1;
103     }
104     int cnt = 0;
105     LStack *tmp = top;
106     while( tmp->link )
107     {
108         tmp = tmp->link;
109         cnt ++;
110     }
111     return cnt;
112 }
113 
114 void linkedStack::displayStack()
115 {
116     if( stackEmpty() )
117     {
118         cerr << "Stack is empty!Error in linkedStack::displayStack()" << endl;
119         return;
120     }
121     LStack *tmp = top;
122     int column = 0;
123     while( tmp->link )
124     {
125         cout << setw(7) << setiosflags(ios::left) << tmp->data << " ";
126         //cout << tmp->data << " ";
127         column ++;
128         if( column % 10 == 0 )
129             cout << setw(7) << setiosflags(ios::left) << endl;
130         tmp = tmp->link;
131     }
132     cout << endl;
133 }
134 
135 int linkedStack::isp( char _operator )
136 {
137     switch(_operator)
138     {
139     case '#' :
140         return 0;
141         break;
142     case '(':
143         return 6;
144         break;
145     case '*':
146         return 5;
147         break;
148     case '/':
149         return 5;
150         break;
151     case '%':
152         return 5;
153         break;
154     case '+':
155         return 3;
156         break;
157     case '-':
158         return 3;
159         break;
160     case ')':
161         return 1;
162         break;
163     }
164 
165     cerr << "Error in SeqStack::isp" << endl;
166     return -1;
167 }
168 
169 int linkedStack::icp( char _operator )
170 {
171     switch(_operator)
172     {
173     case '#' :
174         return 0;
175         break;
176     case '(':
177         return 1;
178         break;
179     case '*':
180         return 4;
181         break;
182     case '/':
183         return 4;
184         break;
185     case '%':
186         return 4;
187         break;
188     case '+':
189         return 2;
190         break;
191     case '-':
192         return 2;
193         break;
194     case ')':
195         return 6;
196         break;
197     }
198 
199     cerr << "Error in SeqStack::icp" << endl;
200     return -1;
201 }
202 
203 double linkedStack::doOperator( elementType value1, elementType value2, char _operator )
204 {
205     switch(_operator)
206     {
207     case '+':
208         return value1 + value2;
209         break;
210     case '-':
211         return value1 - value2;
212         break;
213     case '*':
214         return value1 * value2;
215         break;
216     case '/':
217         if( fabs(value2) < 0.0001 )
218         {
219             cout << "Divided by 0!" << endl;
220             return -1000000;
221         }
222         else
223             return value1 / value2;
224         break;
225     case '%':
226         if( fabs(value2) < 0.0001 )
227         {
228             cout << "Divided by 0!" << endl;
229             return -1000000;
230         }
231         else
232             return (int)value1 % (int)value2;
233         break;
234         
235     }
236 
237     cerr << "Error in SeqStack::doOperator" << endl;
238     return -1;
239 }
240 
241 void linkedStack::calculate( char* Str )
242 {
243     charLinkedStack css1;
244     char ch1;
245     int i = 0;
246     double a, b;
247     
248     int level = 0;
249     int temp = 0;
250  
251     while ( Str[i] != '\0' )
252     {
253         i ++;
254     }
255     i = i - 2;
256     while( css1.topValue() != NULL || Str[i] != '#' )
257     {
258         char ch = Str[i];
259         if ( isdigit(ch) )
260         {
261             temp = temp + pow( 10, level ) * int( ch - '0' );
262             level ++;
263             i --;
264         }
265         else
266         {
267             if (level)
268             {
269                 push(temp);
270                 temp = 0;
271                 level = 0;
272             }
273             css1.getTop(ch1);
274             if ( ch1 == ')' && ch == '(' )
275             {
276                 css1.pop();
277                 i --;
278                 continue;
279             }
280             if ( isp(ch1) < icp(ch) )
281             {
282                 css1.push(ch);
283                 i --;
284             }
285             else if (isp(ch1) >= icp(ch))
286             {
287                 getTop(a);
288                 pop();
289                 getTop(b);
290                 pop();
291                 push( doOperator( a, b, ch1 ) );
292                 css1.pop();
293             }
294         }
295     }
296 
297     if (level)
298     {
299         push(temp);
300     }
301      
302 }
303 
304 bool linkedStack::isPopOrder()
305 {
306     /*
307     當序列遞增時,ok
308     當序列遞減時,且相差為1 ,ok
309     當序列遞減時,且相差大於1,但後續序列都遞減時,ok
<