用栈实现括号匹配的检验

[cpp]  view plain copy
  1. /* 
  2.     数据结构C语言版 栈实现括号匹配的检验 
  3.     P49 
  4.     编译环境:Dev-C++ 4.9.9.2 
  5.     日期:2011年2月12日 
  6. */  
  7.   
  8. #include <stdio.h>  
  9. #include <malloc.h>  
  10.   
  11. typedef char SElemType; // 栈的元素类型  
  12.   
  13. #define STACK_INIT_SIZE 10  // 存储空间初始分配量  
  14. #define STACKINCREMENT 2    // 存储空间分配增量  
  15. // 栈的顺序存储表示 P46  
  16. typedef struct SqStack  
  17. {  
  18.     SElemType *base;    // 在栈构造之前和销毁之后,base的值为NULL  
  19.     SElemType *top;     // 栈顶指针  
  20.     int stacksize;      // 当前已分配的存储空间,以元素为单位  
  21. }SqStack;   // 顺序栈  
  22.   
  23.   
  24.   
  25. //  构造一个空栈S。  
  26. int InitStack(SqStack *S)  
  27. {  
  28.     // 为栈底分配一个指定大小的存储空间  
  29.     (*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));  
  30.     if( !(*S).base )  
  31.         exit(0);        // 存储分配失败  
  32.     (*S).top = (*S).base;   // 栈底与栈顶相同表示一个空栈  
  33.     (*S).stacksize = STACK_INIT_SIZE;  
  34.     return 1;  
  35. }  
  36.   
  37.   
  38. // 若栈S为空栈(栈顶与栈底相同的),则返回1,否则返回0。  
  39. int StackEmpty(SqStack S)  
  40. {  
  41.     if(S.top == S.base)  
  42.         return 1;  
  43.     else  
  44.         return 0;  
  45. }  
  46.   
  47. //  插入元素e为新的栈顶元素。  
  48. int Push(SqStack *S, SElemType e)  
  49. {  
  50.     if((*S).top - (*S).base >= (*S).stacksize)   // 栈满,追加存储空间  
  51.     {  
  52.         (*S).base = (SElemType *)realloc((*S).base,  
  53.             ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType));  
  54.         if( !(*S).base )  
  55.             exit(0); // 存储分配失败  
  56.         (*S).top = (*S).base+(*S).stacksize;  
  57.         (*S).stacksize += STACKINCREMENT;  
  58.     }  
  59.     *((*S).top)++=e;  
  60.     // 这个等式的++ * 优先级相同,但是它们的运算方式,是自右向左  
  61.     return 1;  
  62. }  
  63.   
  64. //  若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则返回0。  
  65. int Pop(SqStack *S,SElemType *e)  
  66. {  
  67.     if((*S).top == (*S).base)  
  68.         return 0;  
  69.     *e = *--(*S).top;  
  70.     // 这个等式的++ * 优先级相同,但是它们的运算方式,是自右向左  
  71.     return 1;  
  72. }  
  73.   
  74. //  对于输入的任意一个字符串,检验括号是否配对.  
  75. void check()  
  76. {  
  77.     SqStack s;  
  78.     SElemType ch[80], *p, e;  
  79.   
  80.     if(InitStack( &s )) // 初始化栈成功  
  81.     {  
  82.         printf("请输入表达式\n");  
  83.         gets(ch);  
  84.         p = ch;  
  85.         while(*p)   // 没到串尾  
  86.             switch(*p)  
  87.             {  
  88.             case '(':  
  89.             case '[':  
  90.                 Push(&s,*p++);  
  91.                 break;  // 左括号入栈,且p++  
  92.             case ')':  
  93.             case ']':  
  94.                 if(!StackEmpty(s))  // 栈不空  
  95.                 {  
  96.                     Pop(&s, &e);    // 弹出栈顶元素  
  97.                     // 弹出的栈顶元素与*p不配对  
  98.                     if(*p == ')' && e != '(' || *p == ']' && e != '[' )  
  99.                     {  
  100.                       printf("左右括号不配对\n");  
  101.                       return;  
  102.                     }  
  103.                     else  
  104.                     {  
  105.                         p++;  
  106.                         break// 跳出switch语句  
  107.                     }  
  108.                 }  
  109.                 else // 栈空  
  110.                 {  
  111.                     printf("缺乏左括号\n");  
  112.                     return;  
  113.                 }  
  114.             default: p++; // 其它字符不处理,指针向后移  
  115.         }  
  116.         if(StackEmpty(s)) // 字符串结束时栈空  
  117.             printf("括号匹配\n");  
  118.         else  
  119.             printf("缺乏右括号\n");  
  120.     }  
  121. }  
  122.   
  123. int main()  
  124. {  
  125.     check();  
  126.       
  127.     system("pause");  
  128.     return 0;  
  129. }  
  130.   
  131. /* 
  132. 输出效果: 
  133.  
  134. 请输入表达式 
  135. (1+3 
  136. 缺乏右括号 
  137. 请按任意键继续. . . 
  138.  
  139. */ 
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值