資料結構實驗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 <