棧的應用(C++實現)


使用C++語言實現棧的創建、進棧、出棧、判斷棧空等功能。

  1 #include <iostream>
  2 #include <string.h>
  3 using namespace std ;
  4 
  5 #define ERROR -1
  6 #define CORRECT 1
  7 
  8 //堆棧的定義,定義一個堆棧結構,其存儲結構包含棧底指針base和棧頂指針top
  9 #define MAXSTACKSIZE 100
 10 typedef struct SqStack
 11 {
 12     char base[MAXSTACKSIZE] ;
 13     char *top ;
 14 } SqStack ;
 15 
 16 SqStack MBStack ;
 17 
 18 //初始化堆棧,若棧不存在(base == NULL),返回ERROR,將top指向base
 19 int InitStack (SqStack &S)
 20 {
 21     if (S.base == NULL)
 22     {
 23         return (ERROR) ;
 24     }
 25     else
 26     {
 27         S.top = S.base ;    //初始化堆棧(清空)
 28         return (CORRECT) ;
 29     }
 30 }
 31 
 32 //進棧,若top超出范圍,返回ERROR,將數據(e)插入棧頂指定位置(top)上,棧頂指針(top)加一
 33 int Push (SqStack &S , char e)
 34 {
 35     if ((S.top-S.base) >= MAXSTACKSIZE)
 36     {
 37         return (ERROR) ;
 38     }
 39     else
 40     {
 41         S.base[S.top - S.base] = e ;
 42         S.top++ ;
 43         return (CORRECT) ;
 44     }
 45 }
 46 
 47 //出棧,若為空,返回ERROR,否則取出一個數據放入變量e中,top--
 48 int Pop (SqStack &S , char &e)
 49 {
 50     if (S.top <= S.base)
 51     {
 52         return (ERROR) ;
 53     }
 54     else
 55     {
 56         e = S.base[S.top - S.base - 1] ;
 57         S.top-- ;
 58         return (CORRECT) ;
 59     }
 60 }
 61 
 62 //判斷棧空
 63 int StackEmpty (SqStack &S)
 64 {
 65     if (S.top <= S.base)
 66     {
 67         return (ERROR) ;
 68     }
 69     else
 70     {
 71         return (CORRECT) ;
 72     }
 73 }
 74 
 75 //括號匹配
 76 int MatchBracket (SqStack &S , char *BracketString)
 77 {
 78     int i ;
 79     char C , sC ;
 80 
 81     InitStack (S) ;    //清空堆棧
 82     for (i = 0 ; i < strlen (BracketString) ; i++)
 83     {
 84         C = BracketString[i] ;
 85 
 86         if ((C == '(') || (C == '[') || (C == '{'))
 87         {
 88             Push (S , C) ;
 89         }
 90         if ((C == ')') || (C == ']') || (C == '}'))
 91         {
 92             if (StackEmpty (S) == ERROR)
 93             {
 94                 return (-2) ;    //右多於左
 95             }
 96             Pop (S , sC) ;
 97             if ((C == ')') && (sC != '('))
 98             {
 99                 return (-1);    //左右次序不對
100             }
101             if ((C == ']') && (sC != '['))
102             {
103                 return (-1);    //左右次序不對
104             }
105             if ((C == '}') && (sC != '{'))
106             {
107                 return (-1);    //左右次序不對
108             }                        
109         }
110     }
111 
112     if (StackEmpty (S) != ERROR)    //非空
113     {
114         return (-3) ;  //左多於右
115     }
116 
117     else
118     {
119         return (0) ;    //棧空則正確
120     }
121 }
122 
123 //主函數
124 int main (int argc , char* argv[])
125 {
126     int i , SampleNum ;
127     char BracketString[MAXSTACKSIZE] ;
128 
129     cin >> SampleNum ;
130     for (i = 0 ; i < SampleNum ; i ++)
131     {
132         cin >> BracketString ;
133         cout << MatchBracket (MBStack , BracketString) << endl ;
134     }
135     return 0 ;
136 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM