栈实现括号匹配

来源:互联网 发布:淘宝怎么找类似店铺 编辑:程序博客网 时间:2024/06/06 17:07

算法:检测表达式中的字符,若是左括号就入栈,如果是右括号就出栈一个元素与其配对,配对成功则继续访问下一个字符,否则退出。出现非括号字符则跳过。

[cpp] view plain copy print?
  1. #include <stdio.h>  
  2. #include <malloc.h>   //malloc,realloc  
  3. #include <math.h>     //含有overflow  
  4. #include <process.h>  //exit()  
  5. #define S_SIZE 100   //栈的空间大小  
  6. #define STACKINCREAMENT 10//增加空间  
  7. struct SqStack{  
  8.     int *base; //栈底  
  9.     int *top;  //栈顶  
  10.     int stacksize;   //栈当前的存储空间  
  11. };  
  12. void main()  
  13. {//子函数声明  
  14.     void InitStack(SqStack &S);//初始化空栈  
  15.     int StackEmpty(SqStack S);//判空  
  16.     void push(SqStack &S,int e);//进栈  
  17.     void pop(SqStack &S,int &e);//出栈  
  18.     //主函数开始  
  19.     SqStack s;//初始化空栈  
  20.     InitStack(s);  
  21.     char ch[100],*p;int e;  
  22.     p=ch;  
  23.     printf("输一个含义有()[]{}的括号表达式:\n");  
  24.     gets(ch);  
  25.     while(*p)  
  26.     {   
  27.         switch (*p)  
  28.         {  
  29.         case '{':  
  30.         case '[':  
  31.         case '(': push(s,*p++);break;//只要是左括号就入栈  
  32.         case '}':  
  33.         case ']':  
  34.         case ')':pop(s,e);  
  35.                  if ((e=='{' && *p=='}') ||(e=='[' && *p==']') || (e=='(' && *p==')'))  
  36.                  p++;  
  37.                  else  
  38.                  {printf("括号不匹配!");exit(OVERFLOW);}  
  39.                  break;  
  40.         default :p++;//其他字符就后移  
  41.         }  
  42.     }  
  43.     if (StackEmpty(s))  
  44.       printf("括号匹配成功");  
  45.     else  
  46.       printf("缺少右括号!");  
  47.     printf("\n");  
  48. }  
  49. void InitStack(SqStack &S)  
  50. {S.base=(int *)malloc(S_SIZE*sizeof(int));  
  51. S.stacksize=S_SIZE;  
  52. S.top=S.base;//初始化空栈  
  53. }  
  54. int StackEmpty(SqStack S)  
  55. {  
  56.     if(S.base==S.top)  
  57.         return 1;  
  58.     else  
  59.         return 0;  
  60. }  
  61. void push(SqStack &S,int e)  
  62. {//进栈  
  63.     if(S.top-S.base>=S.stacksize)  
  64.     {S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));  
  65.     S.top=S.base+S.stacksize;  
  66.     S.stacksize+=STACKINCREAMENT;}  
  67.     *(S.top)=e;  
  68.     S.top++;        
  69. }  
  70. void pop(SqStack &S,int &e)  
  71. {//出栈  
  72.     if(S.base!=S.top)  
  73.     {S.top--;  
  74.     e=*S.top;}  
  75. }  

转载于: http://blog.csdn.net/kkkkkxiaofei/article/details/8293980 
 

原创粉丝点击