栈的应用(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 }

 

posted @ 2016-10-27 01:03  maoguy  阅读(6061)  评论(0编辑  收藏  举报